En este informe se detalla el estudio realizado sobre un dataset que recoge información relevante de las viviendas en Boston. El estudio, intentara mediante un modelo de regresión lineal múltiple, predecir el valor de la vivienda.
Para el control de versiones utilizaremos github. El repositorio se encuentra en https://github.com/AnaFernandezCruz/MetodosAnalisisDatos .
Antes de empezar a realizar el estudio debemos unificar los datos. Inicialmente los disponemos en tres archivos csv, ‘train.csv’, ‘test.csv’ y ‘sample_submission.csv’.
Despues de unirlos bajo un solo dataset, lo separemos de manera aleatoria en dos grupos. El primer grupo sera el 10% del total y lo utilizaremos como validación. Este dataset lo utilizaremos al final del estudio para comprobar como funciona nuestro modelo. El resto de los datos, el 90% faltante, lo utilizaremos para training y testing.
Realizaremos un primer resumen del estado del dataset:
introduce(dataset)
## # A tibble: 1 x 9
## rows columns discrete_columns continuous_colu… all_missing_col…
## <int> <int> <int> <int> <int>
## 1 2628 81 43 38 0
## # … with 4 more variables: total_missing_values <int>, complete_rows <int>,
## # total_observations <int>, memory_usage <dbl>
Vemos que el dataset está dividido en:
Realizaremos un gráfico mirando la distribución de los datos por tipos y otra información que la anterior tabla ya incluía:
plot_intro(dataset)
Como hemos indicado antes, vemos que este gráfico muestra en los valores de “complete rows” un valor del 0%, lo cuál parece indicar un problema con alguna columna en particular. Lo que observamos es que el valor NA es un valor de algunas de las columnas válido, con lo que habría que corregir esto para estas columnas y volver a hacer el análisis. Supondremos que para estas columnas no existe ningún valor genuinamente en blanco:
Alley: NA-No alley access, BsmtQual: NA-No Basement, BsmtCond: NA-No Basement, BsmtExposure: NA-No Basement, BsmtFinType1: NA-No Basement, BsmtFinType2: NA-No Basement, GarageType: NA-No Garage, GarageFinish: NA-No Garage, GarageQual: NA-No Garage, GarageCond: NA-No Garage, PoolQC: NA-No Pool, Fence: NA-No Fence, MiscFeature:NA-None
El siguiente código realiza la transformación anterior:
cols_remove_nas <-c('Alley','BsmtQual','BsmtCond','BsmtExposure','BsmtFinType1','BsmtFinType2','GarageType','GarageFinish','GarageQual','GarageCond','PoolQC','Fence','MiscFeature','FireplaceQu')
dataset <- mutate_at(dataset, cols_remove_nas,
list(~ifelse(is.na(.), 'NA',.)) )
#Dividimos el dataset 70% - 30%
list_split <- dataset %>% split_dataframe(.7)
train <- list_split[[1]] # 70%
test <- list_split[[2]] # 30%
Las variables que nos encontraremos en el dataset son las siguientes:
MSSubClass: La clase de construcción MSZoning: La clasificación general de zonificación LotFrontage: Pies lineales de calle conectados a la propiedad LotArea: Tamaño del lote en pies cuadrados Street: Tipo de acceso por carretera Alley: Tipo de acceso al callejón LotShape: Forma general de propiedad LandContour: Llanura de la propiedad Utilities: Tipo de utilidades disponibles LotConfig: Configuración del lote LandSlope: Pendiente de la propiedad Neighborhood: Ubicaciones físicas dentro de los límites de la ciudad de Ames Condition1: Proximidad a la carretera principal o ferrocarril Condition2: Proximidad a la carretera principal o al ferrocarril (si hay un segundo) BldgType: Tipo de vivienda HouseStyle: Estilo de vivienda OverallQual: Material general y calidad de acabado OverallCond: Calificación de condición general YearBuilt: Fecha de construcción original YearRemodAdd: Fecha de remodelación RoofStyle: Tipo de techo RoofMatl: Material del techo Exterior1st: Cubierta exterior en la casa Exterior2nd: Revestimiento exterior de la casa (si hay más de un material) MasVnrType: Tipo de chapa de albañilería MasVnrArea: Área de revestimiento de mampostería en pies cuadrados ExterQual: Calidad del material exterior ExterCond: Condición actual del material en el exterior. Foundation: Tipo de cimiento BsmtQual: Altura del sótano BsmtCond: Estado general del sótano BsmtExposure: Paredes de sótano a nivel de jardín o de salida BsmtFinType1: Calidad del área terminada del sótano BsmtFinSF1: Tipo 1 terminado pies cuadrados BsmtFinType2: Calidad de la segunda área terminada (si está presente) BsmtFinSF2: Pies cuadrados terminados tipo 2 BsmtUnfSF: Pies cuadrados inacabados de área de sótano TotalBsmtSF: Pies cuadrados totales del área del sótano Heating: Tipo de calefacción HeatingQC: Calidad y condición de calefacción CentralAir: Aire acondicionado central Electrical: Sistema eléctrico 1stFlrSF: Pies cuadrados del primer piso 2ndFlrSF: Pies cuadrados del segundo piso LowQualFinSF: Pies cuadrados terminados de baja calidad (todos los pisos) GrLivArea: Superficie habitable por encima del nivel del suelo (pies cuadrados) BsmtFullBath: Baños completos en el sótano BsmtHalfBath: Medio baño en el sótano FullBath: Baños completos por encima del grado HalfBath: Medio baño por encima del grado Bedroom: Número de dormitorios por encima del nivel del sótano Kitchen: Número de cocinas KitchenQual: Calidad de cocina TotRmsAbvGrd: Total de habitaciones por encima del grado (no incluye baños) Functional: Calificación de funcionalidad doméstica Fireplaces: Número de chimeneas FireplaceQu: Calidad de chimenea GarageType: Ubicación del garaje GarageYrBlt: Año en que se construyó el garaje GarageFinish: Acabado interior del garaje GarageCars: Tamaño del garaje en la capacidad del automóvil GarageArea: Tamaño del garaje en pies cuadrados GarageQual: Calidad de garaje GarageCond: Condición del garaje PavedDrive: Entrada pavimentada WoodDeckSF: Área de cubierta de madera en pies cuadrados OpenPorchSF: Área de porche abierto en pies cuadrados Porche cerrado: Área de porche cerrado en pies cuadrados EnclosedPorch: Área de porche de tres estaciones en pies cuadrados ScreenPorch: Área del porche de la pantalla en pies cuadrados PoolArea: Área de la piscina en pies cuadrados PoolQC: Calidad de la piscina Fence: Calidad de la cerca MiscFeature: Características varias no cubiertas en otras categorías MiscVal: Valor de la característica miscelánea MoSold: Mes vendido YrSold: Año vendido SaleType: Tipo de venta SaleCondition: Condición de venta
A continuación, dividiremos las variables en las siguientes categorías: * Variables con dominio contínuo y numérico * Variable con dominio numérico discreto * Variables descriptivas nominales (variables que toman valores alfanumérido de un conjunto finito de valores) * Variables descriptivas ordinales (variables que contienen una relación de orden)
El siguiente código realiza la descomposición en dichas categorías para usar con posterioridad:
var_discretas <- c('BsmtFullBath','BsmtHalfBath','FullBath','HalfBath','BedroomAbvGr','KitchenAbvGr','TotRmsAbvGrd','Fireplaces','GarageCars','GarageYrBlt','YearBuilt','YearRemodAdd','YrSold','MoSold')
var_continuas <- c('LotFrontage','LotArea','MasVnrArea','BsmtFinSF1','BsmtFinSF2','BsmtUnfSF','TotalBsmtSF','1stFlrSF','2ndFlrSF','LowQualFinSF','GrLivArea','GarageArea','WoodDeckSF','OpenPorchSF','EnclosedPorch', '3SsnPorch','ScreenPorch','PoolArea','MiscVal','SalePrice')
var_continuas_sin_columnas_imputacion <- c('LotFrontage','LotArea','MasVnrArea','BsmtFinSF1','BsmtFinSF2','BsmtUnfSF','TotalBsmtSF','1stFlrSF','2ndFlrSF','LowQualFinSF','GrLivArea','GarageArea','WoodDeckSF','OpenPorchSF','EnclosedPorch', '3SsnPorch','ScreenPorch','PoolArea','MiscVal','SalePrice')
var_ordinales <- c('LotShape','Utilities','LandSlope','OverallQual','OverallCond','ExterQual','ExterCond','BsmtQual','BsmtCond','BsmtExposure','BsmtFinType1','BsmtFinType2','HeatingQC','CentralAir','Electrical','KitchenQual','Functional','FireplaceQu','GarageFinish','GarageQual','GarageCond','PavedDrive','PoolQC','Fence')
var_nominales <- c('MSSubClass','MSZoning','Street','Alley','LandContour','LotConfig','Neighborhood','Condition1','Condition2','BldgType','HouseStyle','RoofStyle','RoofMatl','Exterior1st',
'Exterior2nd','MasVnrType','Foundation','Heating','GarageType','MiscFeature', 'SaleType','SaleCondition')
var_continuas_discretas = c(var_continuas,var_discretas)
var_continuas_discretas_sin_imputacion = c(var_continuas_sin_columnas_imputacion,var_discretas)
var_modelo = c()
var_columnas_eliminadas = c()
var_transformacion_log = c()
var_eliminar_correlacion = c()
var_creadas_transformacion = c()
A continuación realizaremos un pequeño informe mostrando algunas características de los datos que contienen el dataset:
skim(train) %>% pander()
| skim_type | skim_variable | n_missing | complete_rate | character.min |
|---|---|---|---|---|
| character | MSZoning | 2 | 0.9989 | 2 |
| character | Street | 0 | 1 | 4 |
| character | Alley | 0 | 1 | 2 |
| character | LotShape | 0 | 1 | 3 |
| character | LandContour | 0 | 1 | 3 |
| character | Utilities | 0 | 1 | 6 |
| character | LotConfig | 0 | 1 | 3 |
| character | LandSlope | 0 | 1 | 3 |
| character | Neighborhood | 0 | 1 | 5 |
| character | Condition1 | 0 | 1 | 4 |
| character | Condition2 | 0 | 1 | 4 |
| character | BldgType | 0 | 1 | 4 |
| character | HouseStyle | 0 | 1 | 4 |
| character | RoofStyle | 0 | 1 | 3 |
| character | RoofMatl | 0 | 1 | 5 |
| character | Exterior1st | 1 | 0.9995 | 5 |
| character | Exterior2nd | 1 | 0.9995 | 5 |
| character | MasVnrType | 17 | 0.9908 | 4 |
| character | ExterQual | 0 | 1 | 2 |
| character | ExterCond | 0 | 1 | 2 |
| character | Foundation | 0 | 1 | 4 |
| character | BsmtQual | 0 | 1 | 2 |
| character | BsmtCond | 0 | 1 | 2 |
| character | BsmtExposure | 0 | 1 | 2 |
| character | BsmtFinType1 | 0 | 1 | 2 |
| character | BsmtFinType2 | 0 | 1 | 2 |
| character | Heating | 0 | 1 | 4 |
| character | HeatingQC | 0 | 1 | 2 |
| character | CentralAir | 0 | 1 | 1 |
| character | Electrical | 1 | 0.9995 | 5 |
| character | KitchenQual | 1 | 0.9995 | 2 |
| character | Functional | 0 | 1 | 3 |
| character | FireplaceQu | 0 | 1 | 2 |
| character | GarageType | 0 | 1 | 2 |
| character | GarageFinish | 0 | 1 | 2 |
| character | GarageQual | 0 | 1 | 2 |
| character | GarageCond | 0 | 1 | 2 |
| character | PavedDrive | 0 | 1 | 1 |
| character | PoolQC | 0 | 1 | 2 |
| character | Fence | 0 | 1 | 2 |
| character | MiscFeature | 0 | 1 | 2 |
| character | SaleType | 1 | 0.9995 | 2 |
| character | SaleCondition | 0 | 1 | 6 |
| numeric | Id | 0 | 1 | NA |
| numeric | MSSubClass | 0 | 1 | NA |
| numeric | LotFrontage | 314 | 0.8293 | NA |
| numeric | LotArea | 0 | 1 | NA |
| numeric | OverallQual | 0 | 1 | NA |
| numeric | OverallCond | 0 | 1 | NA |
| numeric | YearBuilt | 0 | 1 | NA |
| numeric | YearRemodAdd | 0 | 1 | NA |
| numeric | MasVnrArea | 16 | 0.9913 | NA |
| numeric | BsmtFinSF1 | 1 | 0.9995 | NA |
| numeric | BsmtFinSF2 | 1 | 0.9995 | NA |
| numeric | BsmtUnfSF | 1 | 0.9995 | NA |
| numeric | TotalBsmtSF | 1 | 0.9995 | NA |
| numeric | 1stFlrSF | 0 | 1 | NA |
| numeric | 2ndFlrSF | 0 | 1 | NA |
| numeric | LowQualFinSF | 0 | 1 | NA |
| numeric | GrLivArea | 0 | 1 | NA |
| numeric | BsmtFullBath | 2 | 0.9989 | NA |
| numeric | BsmtHalfBath | 2 | 0.9989 | NA |
| numeric | FullBath | 0 | 1 | NA |
| numeric | HalfBath | 0 | 1 | NA |
| numeric | BedroomAbvGr | 0 | 1 | NA |
| numeric | KitchenAbvGr | 0 | 1 | NA |
| numeric | TotRmsAbvGrd | 0 | 1 | NA |
| numeric | Fireplaces | 0 | 1 | NA |
| numeric | GarageYrBlt | 96 | 0.9478 | NA |
| numeric | GarageCars | 1 | 0.9995 | NA |
| numeric | GarageArea | 1 | 0.9995 | NA |
| numeric | WoodDeckSF | 0 | 1 | NA |
| numeric | OpenPorchSF | 0 | 1 | NA |
| numeric | EnclosedPorch | 0 | 1 | NA |
| numeric | 3SsnPorch | 0 | 1 | NA |
| numeric | ScreenPorch | 0 | 1 | NA |
| numeric | PoolArea | 0 | 1 | NA |
| numeric | MiscVal | 0 | 1 | NA |
| numeric | MoSold | 0 | 1 | NA |
| numeric | YrSold | 0 | 1 | NA |
| numeric | SalePrice | 0 | 1 | NA |
| character.max | character.empty | character.n_unique | character.whitespace |
|---|---|---|---|
| 7 | 0 | 5 | 0 |
| 4 | 0 | 2 | 0 |
| 4 | 0 | 3 | 0 |
| 3 | 0 | 4 | 0 |
| 3 | 0 | 4 | 0 |
| 6 | 0 | 2 | 0 |
| 7 | 0 | 5 | 0 |
| 3 | 0 | 3 | 0 |
| 7 | 0 | 25 | 0 |
| 6 | 0 | 9 | 0 |
| 6 | 0 | 7 | 0 |
| 6 | 0 | 5 | 0 |
| 6 | 0 | 8 | 0 |
| 7 | 0 | 6 | 0 |
| 7 | 0 | 6 | 0 |
| 7 | 0 | 13 | 0 |
| 7 | 0 | 15 | 0 |
| 7 | 0 | 4 | 0 |
| 2 | 0 | 4 | 0 |
| 2 | 0 | 4 | 0 |
| 6 | 0 | 6 | 0 |
| 2 | 0 | 5 | 0 |
| 2 | 0 | 4 | 0 |
| 2 | 0 | 5 | 0 |
| 3 | 0 | 7 | 0 |
| 3 | 0 | 7 | 0 |
| 5 | 0 | 6 | 0 |
| 2 | 0 | 5 | 0 |
| 1 | 0 | 2 | 0 |
| 5 | 0 | 4 | 0 |
| 2 | 0 | 4 | 0 |
| 4 | 0 | 7 | 0 |
| 2 | 0 | 6 | 0 |
| 7 | 0 | 7 | 0 |
| 3 | 0 | 4 | 0 |
| 2 | 0 | 6 | 0 |
| 2 | 0 | 6 | 0 |
| 1 | 0 | 3 | 0 |
| 2 | 0 | 4 | 0 |
| 5 | 0 | 5 | 0 |
| 4 | 0 | 5 | 0 |
| 5 | 0 | 9 | 0 |
| 7 | 0 | 6 | 0 |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| NA | NA | NA | NA |
| numeric.mean | numeric.sd | numeric.p0 | numeric.p25 | numeric.p50 |
|---|---|---|---|---|
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA |
| 1465 | 839 | 1 | 749.5 | 1457 |
| 58.01 | 43.08 | 20 | 20 | 50 |
| 68.69 | 22.73 | 21 | 58 | 68 |
| 10072 | 7474 | 1300 | 7336 | 9317 |
| 6.086 | 1.382 | 1 | 5 | 6 |
| 5.578 | 1.111 | 1 | 5 | 5 |
| 1971 | 29.89 | 1872 | 1954 | 1973 |
| 1984 | 20.8 | 1950 | 1965 | 1992 |
| 101.4 | 182.1 | 0 | 0 | 0 |
| 442.5 | 463 | 0 | 0 | 370.5 |
| 49.83 | 165.9 | 0 | 0 | 0 |
| 558.8 | 439.4 | 0 | 220 | 469 |
| 1051 | 445.8 | 0 | 795.2 | 984 |
| 1154 | 398.1 | 372 | 874 | 1072 |
| 344.9 | 434 | 0 | 0 | 0 |
| 2.956 | 35.17 | 0 | 0 | 0 |
| 1501 | 515.7 | 438 | 1122 | 1440 |
| 0.4284 | 0.5259 | 0 | 0 | 0 |
| 0.06151 | 0.247 | 0 | 0 | 0 |
| 1.575 | 0.5537 | 0 | 1 | 2 |
| 0.3817 | 0.5035 | 0 | 0 | 0 |
| 2.865 | 0.8189 | 0 | 2 | 3 |
| 1.049 | 0.2243 | 0 | 1 | 1 |
| 6.443 | 1.57 | 3 | 5 | 6 |
| 0.5965 | 0.6517 | 0 | 0 | 1 |
| 1978 | 24.94 | 1895 | 1960 | 1978 |
| 1.77 | 0.7564 | 0 | 1 | 2 |
| 474.4 | 215.3 | 0 | 324 | 480 |
| 91.78 | 124.4 | 0 | 0 | 0 |
| 46.37 | 68.51 | 0 | 0 | 24 |
| 23.15 | 65.86 | 0 | 0 | 0 |
| 2.312 | 24.69 | 0 | 0 | 0 |
| 15.82 | 55.74 | 0 | 0 | 0 |
| 3.173 | 41.48 | 0 | 0 | 0 |
| 66.43 | 696.5 | 0 | 0 | 0 |
| 6.207 | 2.738 | 1 | 4 | 6 |
| 2008 | 1.322 | 2006 | 2007 | 2008 |
| 179322 | 57204 | 35311 | 154266 | 176261 |
| numeric.p75 | numeric.p100 | numeric.hist |
|---|---|---|
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| NA | NA | NA |
| 2188 | 2919 | ▇▇▇▇▇ |
| 70 | 190 | ▇▅▂▁▁ |
| 80 | 313 | ▇▃▁▁▁ |
| 11430 | 164660 | ▇▁▁▁▁ |
| 7 | 10 | ▁▁▇▅▁ |
| 6 | 9 | ▁▁▇▅▁ |
| 2000 | 2010 | ▁▂▃▆▇ |
| 2003 | 2010 | ▅▂▂▃▇ |
| 163.5 | 1600 | ▇▁▁▁▁ |
| 730.5 | 5644 | ▇▁▁▁▁ |
| 0 | 1474 | ▇▁▁▁▁ |
| 797 | 2153 | ▇▆▂▁▁ |
| 1288 | 6110 | ▇▃▁▁▁ |
| 1371 | 5095 | ▇▃▁▁▁ |
| 720 | 2065 | ▇▃▂▁▁ |
| 0 | 697 | ▇▁▁▁▁ |
| 1741 | 5642 | ▇▆▁▁▁ |
| 1 | 3 | ▇▆▁▁▁ |
| 0 | 2 | ▇▁▁▁▁ |
| 2 | 4 | ▁▇▇▁▁ |
| 1 | 2 | ▇▁▅▁▁ |
| 3 | 6 | ▁▃▇▂▁ |
| 1 | 3 | ▁▇▁▁▁ |
| 7 | 15 | ▅▇▃▁▁ |
| 1 | 4 | ▇▇▁▁▁ |
| 2001 | 2010 | ▁▂▃▅▇ |
| 2 | 5 | ▅▇▂▁▁ |
| 576 | 1488 | ▃▇▃▁▁ |
| 168 | 870 | ▇▂▁▁▁ |
| 66.5 | 742 | ▇▁▁▁▁ |
| 0 | 1012 | ▇▁▁▁▁ |
| 0 | 508 | ▇▁▁▁▁ |
| 0 | 490 | ▇▁▁▁▁ |
| 0 | 800 | ▇▁▁▁▁ |
| 0 | 17000 | ▇▁▁▁▁ |
| 8 | 12 | ▅▆▇▃▃ |
| 2009 | 2010 | ▇▇▇▇▅ |
| 191398 | 755000 | ▇▆▁▁▁ |
A la hora de tratar con cualquier dataset hay que tener en cuenta que hay datos que pueden faltar. Es importante encontrarlos y tratarlos de manera correcta, pues podrían llevarnos a predecir de manera errónea y el modelo habría que tirarlo a la basura.
Tenemos que tener en cuenta si nuestros datos son de naturaleza
Analizando nuestros datos vemos que nuestros datos faltantes pertenecen al grupo de MAR, ya que podemos tener capacidad o no para obtener cierta información de los domicilios de Boston, pero será totalmente aleatoria. Ésta es una buena noticia, ya que podemos utilizar técnicas de imputación para suplir los datos faltantes.
El proceso de detección, tratamiento e imputación de datos faltantes se va a realizar de la siguiente manera:
Analizaremos los grupos antes creados por separado para ver mejor los resultados.
Variables continuas:
missing_data_continuas <- train %>% dplyr::select(var_continuas) %>% plot_missing(theme_config = list(legend.position = "bottom", axis.text.x =element_text(angle = 90),axis.text.y = element_text(size = rel(1))))
Variables discretas:
missing_data_discretas <- train %>% dplyr::select(var_discretas) %>% plot_missing(theme_config = list(legend.position = "bottom", axis.text.x =element_text(angle = 90),axis.text.y = element_text(size = rel(1))))
Variables discretas ordinales:
missing_data_ordinales <- train %>% dplyr::select(var_ordinales) %>% plot_missing(theme_config = list(legend.position = "bottom", axis.text.x =element_text(angle = 90),axis.text.y = element_text(size = rel(1))))
Variables nominales:
missing_data_nominales <- train %>% dplyr::select(var_nominales) %>% plot_missing(theme_config = list(legend.position = "bottom", axis.text.x =element_text(angle = 90),axis.text.y = element_text(size = rel(1))))
Como hay muchas variables que no tienen valores faltantes, vamos a crear un dataset únicamente con las columnas que tienen missings para poder analizar mejor los datos. Para ello:
na_counts <- sapply(train, function(x) sum(is.na(x)))
na_counts_sort <- sort(na_counts, decreasing = TRUE)
na_counts_sort <- na_counts_sort[1:20]
(na_counts_sort)
## LotFrontage GarageYrBlt MasVnrType MasVnrArea MSZoning BsmtFullBath
## 314 96 17 16 2 2
## BsmtHalfBath Exterior1st Exterior2nd BsmtFinSF1 BsmtFinSF2 BsmtUnfSF
## 2 1 1 1 1 1
## TotalBsmtSF Electrical KitchenQual GarageCars GarageArea SaleType
## 1 1 1 1 1 1
## Id MSSubClass
## 0 0
train_na <- train %>% dplyr::select(LotFrontage, MasVnrArea, BsmtFinSF1, BsmtFinSF2, BsmtUnfSF, TotalBsmtSF, GarageArea, GarageYrBlt, BsmtFullBath, BsmtHalfBath, GarageCars, KitchenQual, Electrical, MasVnrType, MSZoning, Exterior1st, Exterior2nd, SaleType)
aggr_plot <- aggr(train_na,col=c('navyblue','red'), numbers=TRUE, sortVars=TRUE, cex.axis=.7, gap=3, ylab=c("Histogram of missing data","Pattern"))
##
## Variables sorted by number of missings:
## Variable Count
## LotFrontage 0.1707449701
## GarageYrBlt 0.0522022838
## MasVnrType 0.0092441544
## MasVnrArea 0.0087003806
## BsmtFullBath 0.0010875476
## BsmtHalfBath 0.0010875476
## MSZoning 0.0010875476
## BsmtFinSF1 0.0005437738
## BsmtFinSF2 0.0005437738
## BsmtUnfSF 0.0005437738
## TotalBsmtSF 0.0005437738
## GarageArea 0.0005437738
## GarageCars 0.0005437738
## KitchenQual 0.0005437738
## Electrical 0.0005437738
## Exterior1st 0.0005437738
## Exterior2nd 0.0005437738
## SaleType 0.0005437738
Ahora podemos prestar verdadera atención a las columnas con datos faltantes.
Si nos fijamos en la columna que más datos faltantes tiene, podemos ver en la descripción del dataset que son la cantidad de pies lineales que hay de acera hasta la puerta de la casa. Además, leyendo la documentación del dataset vemos que los NA’s no significa que no tengan conexión con la acera (un edificio de varios pisos por ejemplo), sino que son datos faltantes. Hemos considerado que una columna con más de un 15% de datos faltantes nos va a desbalancear el dataset drásticamente, por lo que vamos a prescindir de este valor para nuestro estudio y para la imputación de missings, por lo que la borramos del dataset.
aggr_plot <- aggr(train_na,col=c('navyblue','red'), numbers=TRUE, sortVars=TRUE, cex.axis=.7, gap=3, ylab=c("Histogram of missing data","Pattern"))
##
## Variables sorted by number of missings:
## Variable Count
## GarageYrBlt 0.0522022838
## MasVnrType 0.0092441544
## MasVnrArea 0.0087003806
## BsmtFullBath 0.0010875476
## BsmtHalfBath 0.0010875476
## MSZoning 0.0010875476
## BsmtFinSF1 0.0005437738
## BsmtFinSF2 0.0005437738
## BsmtUnfSF 0.0005437738
## TotalBsmtSF 0.0005437738
## GarageArea 0.0005437738
## GarageCars 0.0005437738
## KitchenQual 0.0005437738
## Electrical 0.0005437738
## Exterior1st 0.0005437738
## Exterior2nd 0.0005437738
## SaleType 0.0005437738
Vemos en el último gráfico que, omitiendo la columna con datos faltantes mayor que el 5%, la cantidad de datos faltantes es menor que el 3%. Además vemos en la gráfica de la derecha que lo más habitual es que no falten todos los datos a la vez y a continuación que falten datos de la primera columna “GarageYtBtt”.
El siguiente paso es calcular la proporción de datos faltantes por columna. Para el caso en el que la proporción de datos faltantes sea menor que el 3% (0.03) imputaremos a los valores faltantes de variables cuantitativas su mediana o media, mientras que a las variables categóricas les imputaremos la categoría más frecuente. Para las columnas en que la proporcion de datos faltantes sea superior al 3% (0.03) tendremos que utilizar técnicas de imputación más avanzadas. Si en nuestro dataset se diera el caso en el que existen varias columnas de este útlimo tipo habría que realizar un análisis de sensibilidad para comprobar que no hemos alterado la naturaleza del dataset imputando los datos faltantes.
colMeans(is.na(train_na))
## MasVnrArea BsmtFinSF1 BsmtFinSF2 BsmtUnfSF TotalBsmtSF GarageArea
## 0.0087003806 0.0005437738 0.0005437738 0.0005437738 0.0005437738 0.0005437738
## GarageYrBlt BsmtFullBath BsmtHalfBath GarageCars KitchenQual Electrical
## 0.0522022838 0.0010875476 0.0010875476 0.0005437738 0.0005437738 0.0005437738
## MasVnrType MSZoning Exterior1st Exterior2nd SaleType
## 0.0092441544 0.0010875476 0.0005437738 0.0005437738 0.0005437738
Para el caso de las variables cuya proporción de missings es menor que el 3% (<=16 datos por columna) vamos a utilizar el método de imputar un valor de centralidad, en este caso la media. Antes de proceder a imputar, vemos que
Categóricas: MasVnrType, MSZoning, Functional, Electrical, KitchenQual, SaleType, Exterior1st, Exterior2nd, BsmtFullBath, BsmtHalfBath, Utilities.
Cuantitativas: GarageYrBlt, MasVnrArea, GarageCars, GarageArea, BsmtFinSF1, BsmtFinSF2, BsmtUnfSF, TotalBsmtSF.
Para imputar de manera eficaz y sin tener que analizar por separado las variables categóricas de las cuantitativas vamos a utilizar la biblioteca HMISC. Esta biblioteca tiene dos funciones altamente potentes: impute() y aregImpute(). Se diferencian entre sí en que en la segunda puedes utilizar regresiones, bootstrapping y otros métodos para imputar valores.
summary_antes_imputar <- summary(train)
#para las variables cuantitativas con una proporción del faltantes menor que el 3%,
#imputaremos el valor de la media
cuantitativas <- c('MasVnrArea','GarageCars','GarageArea', 'BsmtFinSF1', 'BsmtFinSF2', 'BsmtUnfSF', 'TotalBsmtSF','BsmtFullBath', 'BsmtHalfBath')
for (i in cuantitativas){
list_values <- ifelse(is.na(train[[i]]),
round(mean(train[[i]], na.rm=TRUE), 0), train[[i]])
train[[i]] <- list_values
}
train
## # A tibble: 1,839 x 80
## Id MSSubClass MSZoning LotArea Street Alley LotShape LandContour Utilities
## <dbl> <dbl> <chr> <dbl> <chr> <chr> <chr> <chr> <chr>
## 1 1989 60 RL 8010 Pave NA IR1 Lvl AllPub
## 2 1692 60 RL 12891 Pave NA IR1 Lvl AllPub
## 3 2885 70 RL 14210 Pave NA IR1 Lvl AllPub
## 4 2800 30 RM 9000 Pave NA Reg Lvl AllPub
## 5 1435 20 RL 17400 Pave NA Reg Low AllPub
## 6 1468 60 RL 8402 Pave NA IR1 Lvl AllPub
## 7 2595 20 RL 6718 Pave NA IR1 Lvl AllPub
## 8 768 50 RL 12508 Pave NA IR1 Lvl AllPub
## 9 2231 60 RL 12018 Pave NA IR1 HLS AllPub
## 10 385 60 RL 53107 Pave NA IR2 Low AllPub
## # … with 1,829 more rows, and 71 more variables: LotConfig <chr>,
## # LandSlope <chr>, Neighborhood <chr>, Condition1 <chr>, Condition2 <chr>,
## # BldgType <chr>, HouseStyle <chr>, OverallQual <dbl>, OverallCond <dbl>,
## # YearBuilt <dbl>, YearRemodAdd <dbl>, RoofStyle <chr>, RoofMatl <chr>,
## # Exterior1st <chr>, Exterior2nd <chr>, MasVnrType <chr>, MasVnrArea <dbl>,
## # ExterQual <chr>, ExterCond <chr>, Foundation <chr>, BsmtQual <chr>,
## # BsmtCond <chr>, BsmtExposure <chr>, BsmtFinType1 <chr>, BsmtFinSF1 <dbl>,
## # BsmtFinType2 <chr>, BsmtFinSF2 <dbl>, BsmtUnfSF <dbl>, TotalBsmtSF <dbl>,
## # Heating <chr>, HeatingQC <chr>, CentralAir <chr>, Electrical <chr>,
## # `1stFlrSF` <dbl>, `2ndFlrSF` <dbl>, LowQualFinSF <dbl>, GrLivArea <dbl>,
## # BsmtFullBath <dbl>, BsmtHalfBath <dbl>, FullBath <dbl>, HalfBath <dbl>,
## # BedroomAbvGr <dbl>, KitchenAbvGr <dbl>, KitchenQual <chr>,
## # TotRmsAbvGrd <dbl>, Functional <chr>, Fireplaces <dbl>, FireplaceQu <chr>,
## # GarageType <chr>, GarageYrBlt <dbl>, GarageFinish <chr>, GarageCars <dbl>,
## # GarageArea <dbl>, GarageQual <chr>, GarageCond <chr>, PavedDrive <chr>,
## # WoodDeckSF <dbl>, OpenPorchSF <dbl>, EnclosedPorch <dbl>,
## # `3SsnPorch` <dbl>, ScreenPorch <dbl>, PoolArea <dbl>, PoolQC <chr>,
## # Fence <chr>, MiscFeature <chr>, MiscVal <dbl>, MoSold <dbl>, YrSold <dbl>,
## # SaleType <chr>, SaleCondition <chr>, SalePrice <dbl>
#para variables categoricas con una proporción de datos faltantes menor que el 3%
#vamos a imputar el valor más frecuente.
categoricas <- c('MasVnrType', 'MSZoning', 'Functional', 'Electrical',
'KitchenQual', 'SaleType', 'Exterior1st', 'Exterior2nd', 'Utilities')
for (i in categoricas){
y = as.data.frame(table(unlist(train[[i]])))
sorted_list <-y[with(y, order(-Freq)),]
frecuent_value <- sorted_list$Var1[1]
list_values <- c()
for(j in 1:length(train[[i]])) {
if(is.na(train[[i]][j])) {
train[[i]][j] = frecuent_value
na.rm=TRUE
list_values = c(list_values, train[[i]][j])
}
else {
list_values = c(list_values, train[[i]][j])
}
}
train[[i]] <- list_values
}
summary_despues_imputar <- summary(train)
Solo nos faltaría una variable por imputar sus valores: GarageYrBlt. Esta columna indica el año en el que se construyó el garaje de la propiedad. No lo vamos a imputar con el valor medio ya que la proporción de datos faltantes es mayor al 3%, así que lo que proponemos para su imputación es lo siguiente: ya que conocemos el vecindario al que pertenecen los pisos, es lógico que el año de construcción del garaje sea similar para todo el vecindario. Vamos a proceder a agrupar los garages por vecindario e imputaremos el año medio correspondiente.
vecindario_precioGaraje<- train %>% dplyr::select(Neighborhood, GarageYrBlt)
vecindario_agrupado <- vecindario_precioGaraje %>%
group_by(Neighborhood) %>%
summarise(mean_data = round(mean(GarageYrBlt,na.rm=TRUE),0))
summary(vecindario_agrupado)
## Neighborhood mean_data
## Length:25 Min. :1945
## Class :character 1st Qu.:1968
## Mode :character Median :1976
## Mean :1978
## 3rd Qu.:1995
## Max. :2005
#En la variable grouped_list tenemos los vecindarios de Boston y la media del año
#en el que fueron construidos sus garajes. Esos son los valores que usaremos para imputar.
year_corregido<- c()
for(j in 1:length(vecindario_precioGaraje$GarageYrBlt)) {
if(is.na(vecindario_precioGaraje$GarageYrBlt[j])) {
#Obtenemos el vecindario correspondiente al NA
vecindario = vecindario_precioGaraje$Neighborhood[j]
#Ahora que conocemos el vecindario, tenemos que saber cual es el año que le corresponde dentro de la lista de vecindarios, sacamos su numero de fila
index_vecindario = which(grepl(vecindario, vecindario_agrupado$Neighborhood))
#Entramos en este if porque hay dos vecindarios: Sawyer y SawyerW. Cuando buscamos el de Sawyer nos da el indice de los dos vecindarios, asi que nos quedamos con el primero.
if (length(index_vecindario)>1){
index_vecindario = index_vecindario[1]
}
year_a_imputar = vecindario_agrupado[index_vecindario,2]
na.rm=TRUE
year_corregido<-c(year_corregido,year_a_imputar)
}else {
year_corregido<-c(year_corregido,vecindario_precioGaraje$GarageYrBlt[j])
next
}
}
year_corregido<- unlist(year_corregido)
length(year_corregido)
## [1] 1839
#actualizamos la columna en el dataset
train["GarageYrBlt"]<-year_corregido
vecindario_agrupado2 <- vecindario_precioGaraje %>%
group_by(Neighborhood) %>%
summarise(mean_data = round(mean(GarageYrBlt,na.rm=TRUE),0))
summary(vecindario_agrupado2)
## Neighborhood mean_data
## Length:25 Min. :1945
## Class :character 1st Qu.:1968
## Mode :character Median :1976
## Mean :1978
## 3rd Qu.:1995
## Max. :2005
Y ya tendríamos todas las columnas con missing imputadas.
Ahora comenzaremos con el análisis univariante de los datos del dataset. Empezaremos dicho análisis mostrando un conjunto de histogramas para las variables nominales:
train %>% dplyr::select(var_nominales) %>% plot_bar()
A la vista de estos diagramas, observamos lo siguiente:
El siguiente código detectara las variables que tienen baja varianza e intentara eliminar todas aquellas que no sean significativas en una regresión de ella con la variable salePrice :
elementosBajaVarianza <- nearZeroVar(train,freqCut = 95/5,uniqueCut = 10)
# funcion para eliminar elementos con baja correlacion
lmp <- function (modelobject) {
if (class(modelobject) != "lm") stop("No es un objeto de tipo regresion lineal 'lm' ")
f <- summary(modelobject)$fstatistic
p <- pf(f[1],f[2],f[3],lower.tail=F)
attributes(p) <- NULL
return(p)
}
# estas columna dan problemas, la varible 3SnnPorch empieza por un número y a la hora de ejecutar el modelo para ver si son significativas en la regresión
var_columnas_eliminadas = c(var_columnas_eliminadas,'3SsnPorch')
for(i in colnames(train)[elementosBajaVarianza]) {
if(i != '3SsnPorch') {
modelRegression <- lm(reformulate(termlabels = i, response = 'SalePrice') ,data=train)
if(lmp(modelRegression) >.05) {
var_eliminar_correlacion = c(var_eliminar_correlacion,i)
}
}
}
(var_eliminar_correlacion)
## [1] "Street" "Utilities" "LandSlope" "Condition2" "LowQualFinSF"
## [6] "Functional" "MiscFeature" "MiscVal"
Otra cosa que se observa en los anteriores diagramas es que todas las distribuciones continen un alto grado de asimetría (Skewness), cosa que habrá que tener en cuenta por si hay que realizar algún tipo de transformación sobre ellas en futuros apartados de la práctica:
Ahora realizaremos el mismo análisis con las variables ordinales, que no son otra cosa que variables categóricas pero que encierran una relación de orden interna. El tratamiento de estas variables para transformarlas en categóricas y cambiar el ordenamiento alfabético que R les da por defecto:
train %>% dplyr::select(var_ordinales) %>% plot_bar()
<<<<<<< HEAD
Se observan práctimante las mismas anomalías en en el caso anterior, variables con distribuciones muy alejadas de la normalidad y en muchos casos dichas variables apenas aportan información debido a que la mayoría de los valores están concentrados en una única categoría.
Proseguiremos con las variables contínuas:
var_continuas <- c('LotArea','MasVnrArea','BsmtFinSF1','BsmtFinSF2','BsmtUnfSF','TotalBsmtSF','1stFlrSF','2ndFlrSF','LowQualFinSF','GrLivArea','GarageArea','WoodDeckSF','OpenPorchSF','EnclosedPorch', '3SsnPorch','ScreenPorch','PoolArea','MiscVal','SalePrice')
train %>% dplyr::select(var_continuas) %>% plot_histogram()
Los comentarios que se pueden hacer en este caso son los siguientes:
Muy pocas variables parecen seguir una distribución normal y casi todas tienen un fuerte sesgo hacia la izquierda (y unas pocas a la derecha), sugiriendo para muchas de ellas una transformación de tipo logarítmico. Además, algunas de ellas parecen presentar numerosos “outliers” debido a que el rango de variación de las mismas es muy elevado en una gran parte de los valores finales sin que aparezcan casi valores en los mismos.
La variable “Id” es una especie de clave primária organizadora de las filas y hay que eliminarla en los procesos de regresión.
Ahora realizaremos los mismos gráficos para las variables discretas:
train %>% dplyr::select(var_discretas) %>% plot_histogram()
<<<<<<< HEAD
Comentarios parecidos a el análisis de distribución de las variables contínuas se pueden hacer para estas variables. No obstante merece la pena recalcar que algunas de estas variables (YearBuilt,YearRemodAdd y YrSold) codifican años. En estos casos, para simplificar el modelo y debido a la irregular distribución de las mismas, se dividirán estas variables en rangos (de, por ejemplo, 20 años) y se creará una faceta representando esta división en el apartado de tratamiento de variables cuantitativas.
Por último representaremos en sendos diagramas de barras las variables cualitativas nominales. Estas variables deberán convertirse en columnas de tipo “factor” en el dataset sin que el orden que tengan sea realmente importante.
train %>% dplyr::select(var_nominales) %>% plot_bar(nrow =2,ncol=2)
Comentarios parecidos a el análisis de distribución de las variables contínuas se pueden hacer para estas variables. No obstante merece la pena recalcar que algunas de estas variables (YearBuilt,YearRemodAdd y YrSold) codifican años. En estos casos, para simplificar el modelo y debido a la irregular distribución de las mismas, se dividirán estas variables en rangos (de, por ejemplo, 20 años) y se creará una faceta representando esta división en el apartado de tratamiento de variables cuantitativas.
Por último representaremos en sendos diagramas de barras las variables cualitativas nominales. Estas variables deberán convertirse en columnas de tipo “factor” en el dataset sin que el orden que tengan sea realmente importante.
train %>% dplyr::select(var_nominales) %>% plot_bar(nrow =2,ncol=2)
Observamos que hay una variable nominal que tiene una gran cantidad de valores. Esa variable (denominada “Neighbourhoud”) parece especialmente importante debido a que codifica el barrio al que pertenece la casa puesta a la venta, y parece que será importante en el modelo final, por la evidente correlación que habrá entre los precios de la vivienda y la zona en la que se encuentran. No obstante, es una variable con una gran cantidad de valores distintos, lo cuál podría ser un problema para el modelo de regresión lineal.
Ahora nos ocuparemos del análisis de la variable que representa la variable dependiente en nuestro modelo, el precio de las casas. En primer lugar dibujaremos su histograma:
ggplot(train, aes(x=SalePrice)) +
geom_histogram(aes(y=..density..),
binwidth=7000,
colour="black", fill="white") +
geom_density(alpha=.2, fill="#FF6666")
<<<<<<< HEAD
Vemos que esta variable tiene un importe sesgo a la izquierda y parece que un cambio de variable de tipo logarítmico podría convertirla en una variable con distribución normal, cosa importante para el modelo lineal de regresión múltiple. El sesgo es muy fácilmente explicable por la naturaleza de la propia variable: la mayoría de las casas deberán tener un precio ajustado a la distribución de la riqueza entre los habitantes de la ciudad, y muy pocas tendrán un gran valor (casas lujosas) o serán infraviviendas. Confirmemos esta hipótesis realizando el cambio de variable en la misma y dibujando su función de distribución normal aproximada:
fitDistribution <- fitdistr(log10(train$SalePrice), densfun = "normal")
ggplot(data = train) +
geom_histogram(mapping = aes(x = log10(SalePrice), y = ..density..), col="white") +
stat_function(fun = dnorm, args = list(mean = fitDistribution$estimate[1], sd = fitDistribution$estimate[2], log = F),
color="red", lwd=1)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
<<<<<<< HEAD
Vemos que, efectivamente, lo que hemos comentado en el anterior apartado se cumple. Detectamos también que el rango dinámico de la variable es muy grande en su parte derecha sin que apenas haya valores en dicho intervalo, lo que invita a pensar en la presencia de “outliers” (casas de un gran valor económico reservadas a la gente más rica de la ciudad). Dibujaremos sendos diagramas de cajas con la variable original y la variable transformada:
graf3 <- train %>% dplyr::select(SalePrice) %>%
na.omit() %>%
ggplot(aes(x=0,y=SalePrice)) +
geom_boxplot(outlier.colour="black", outlier.shape=16,
outlier.size=2, notch=FALSE)
graf4 <- train %>% dplyr::mutate(log10_saleprice = log10(SalePrice)) %>%
dplyr::select(log10_saleprice) %>%
na.omit() %>%
ggplot(aes(x=0,y=log10_saleprice)) +
geom_boxplot(outlier.colour="black", outlier.shape=16,
outlier.size=2, notch=FALSE)
ggarrange(graf3,graf4)
Vemos claramente la existencia de Outliers en esta variable que la transformación logarítmica no es capaz de resolver, tanto en los valores superiores como en los inferiores. En una parte futura de este apartado, detectaremos y almacenaremos en sendas variables estos Outliers para todas las variables independientes y tomar una decisión de cómo transformales en los apartados de tratamiento de variables cualitativas y cuantitativas.
Ahora realizaremos un conjunto de gráficos cuantil/cuantil sobre las variables continuas y discretas para corroborar que hay pocas variables con una distribución normal:
train %>% plot_qq(sampled_rows = 1000L)
Las que más se aproximan a esta distribución son: LotArea, LotFrontage, GrLivArea, TotalBsmtSF y X1stFlrSF. Este diagrama pone en evidencia también la gran cantidad de Outliers que tienen algunas variables.
Almacenaremos el grado de asimetría de dichas variables para en un futuro poder tener un criterio más claro de qué variables son candidatas a un tipo de transformación logarítmica:
var_continuas_discretas = c(var_continuas,var_discretas)
library(moments)
listasVariablesSkewness <- na.omit(train %>% dplyr::select(var_continuas_discretas)) %>% skewness()
variablesSkewnessAlto <- listasVariablesSkewness[abs(listasVariablesSkewness) > 0.8]
Ahora procedermos a realizar el análisis vivariante de nuestros datos. Empezaremos con analizar los coeficientes de correlación entre las distintas variables. El siguiente diagrama intenta dibujar un mapa de calor de dichas correlaciones para las variables contínuas, pero debido a la gran cantidad de varibles en dicho diagrama no se puede visualizar nada con claridad:
splitDataset <- split_columns(train, binary_as_factor = FALSE)
plot_correlation(na.omit(splitDataset$continuous), type = "c" ,maxcat = 5L,theme_config = list(legend.position = "bottom", axis.text.x =element_text(angle = 90),axis.text.y = element_text(size = rel(0.4)) ))
<<<<<<< HEAD
Crearemos una matriz de correlaciones con las variables continuas para intentar evidencia de mejor forma estos posibles casos de variables fuertemente correlacionadas que podrían desestabilizar el resultado del proceso de regresión lineal:
library(corrr)
corrmatrix <-corrr::correlate(na.omit(train %>% dplyr::select(var_continuas)))
##
## Correlation method: 'pearson'
## Missing treated using: 'pairwise.complete.obs'
rplot(corrmatrix, legend = TRUE, shape = 16,print_cor = TRUE) +theme(axis.text.x = element_text(angle = 90))
<<<<<<< HEAD
## Don't know how to automatically pick scale for object of type noquote. Defaulting to continuous.
## Don't know how to automatically pick scale for object of type noquote. Defaulting to continuous.
Con esta matriz se observan lo siguiente:
La mayor parte de las variables representan una correlación positiva con el precio de la vivienda y entre ellas. Eso es normal debido a que muchas representan cantidades (pies cuadrados en las distintas zonas en las que se descompone las estancias de la vivienda, número y tamaño de cada planta, tamaño de garage y sótanos, etc. ). Evidentemente, cuandos mayores son estos números, normalmente mayor será el valor de la vivienda.
Las variables 1stFlrSF y TotalBsmtSF estan fuertemente correladas, habría que quitar una de ellas en el modelo (es normal que haya una correlacion entre la superficie total del sótano y la de la primera planta)
Existen correlaciones moderadas entre las variables GrLivArea y 1stFlrSF y 2ndFlrSF, no obstante un análisis más detentenido nos muestra que la suma de las siguientes variables tienen correlacion unidad, lo cuál es un punto a favor en la consistencia de los datos de estas variables en el dataset:
## Don't know how to automatically pick scale for object of type noquote. Defaulting to continuous.
## Don't know how to automatically pick scale for object of type noquote. Defaulting to continuous.
Con esta matriz se observan lo siguiente: * La mayor parte de las variables representan una correlación positiva con el precio de la vivienda y entre ellas. Eso es normal debido a que muchas representan cantidades (pies cuadrados en las distintas zonas en las que se descompone las estancias de la vivienda, número y tamaño de cada planta, tamaño de garage y sótanos, etc. ). Evidentemente, cuandos mayores son estos números, normalmente mayor será el valor de la vivienda. * Las variables 1stFlrSF y TotalBsmtSF estan fuertemente correladas, habría que quitar una de ellas en el modelo (es normal que haya una correlacion entre la superficie total del sótano y la de la primera planta) * Existen correlaciones moderadas entre las variables GrLivArea y 1stFlrSF y 2ndFlrSF, no obstante un análisis más detentenido nos muestra que la suma de las siguientes variables tienen correlacion unidad, lo cuál es un punto a favor en la consistencia de los datos de estas variables en el dataset:
>>>>>>> 1a68e1f32bb9ac5b1b5fd87f9333e892037459b5cor(train$GrLivArea, (train$`1stFlrSF` + train$`2ndFlrSF` + train$LowQualFinSF))
## [1] 1
Esto es lógico debido a que la suma de las superficies habitables de la primera y segunda planta mas la superficie de “baja calidad” tienen que coicidir con la superficie total habitable sin contar los sótanos. Es por ello que estas variables o hay que transformarlas para evitar este caso de correlación perfecta o bien eliminar del modelo alguna de ellas. La decisión se tomará mas adelante.
A continuación mostraremos un tipo de gráfica que muestra de forma más visual la anterior matriz de correlación. En ella cuando más cerca están unos puntos de otros existe una mayor similitud entre las distintas variables. Cada una de ellas está a su vez enlazada con una “banda” de color azul o rojo que cuantifica el grado de correlación entre las variables. En ella ya vemos que la variable objetivo de estudio, el precio de venta de la casa, está muy influenciada por todas aquellas variables continuas que cuantifican la superficie en la que se dividen las distintas parcelas de la propiedad (habitaciones, garage, porche, sótano, etc.).
network_plot(corrmatrix)
<<<<<<< HEAD
Ahora proseguiremos el análisis con las variables discretas. Como antes, generaremos una matriz de correlación y
corrmatrix2 <-corrr::correlate(na.omit(train %>% dplyr::select(var_discretas)))
##
## Correlation method: 'pearson'
## Missing treated using: 'pairwise.complete.obs'
rplot(corrmatrix2, legend = TRUE, shape = 16,print_cor = TRUE)+theme(axis.text.x = element_text(angle = 90))
## Don't know how to automatically pick scale for object of type noquote. Defaulting to continuous.
## Don't know how to automatically pick scale for object of type noquote. Defaulting to continuous.
<<<<<<< HEAD
network_plot(corrmatrix2)
Ahora intentaremos hacer este mismo análisis agrupando tanto variables contínuas como discretas, El resultado es el siguiente:
=======network_plot(corrmatrix2)
Existe una fuerte correlación entre las variables GarageYrBlt y YearBuilt y YearRemodAdd, con ello podemos quitarnos la variable GarageYrBlt.
Ahora intentaremos hacer este mismo análisis agrupando tanto variables contínuas como discretas, El resultado es el siguiente:
corrmatrix3 <-corrr::correlate(na.omit(train %>% dplyr::select(var_continuas_discretas)))
##
## Correlation method: 'pearson'
## Missing treated using: 'pairwise.complete.obs'
rplot(corrmatrix3, legend = TRUE, shape = 16,print_cor = TRUE)+theme(axis.text.x = element_text(angle = 90))
## Don't know how to automatically pick scale for object of type noquote. Defaulting to continuous.
## Don't know how to automatically pick scale for object of type noquote. Defaulting to continuous.
<<<<<<< HEAD
network_plot(corrmatrix3)
Aqui Observamos una correlación muy fuerte entre las variables GarageCars y GarageArea, con lo que nos podemos quitar la variable GarageCars.Es lógico pensar que el número de coches que caben en una plaza de garage dependa de la superficie de ésta.
Existe una correlacion muy fuerte también entre las variables GrLiveArea y TotRmsAbvGrd (total de habitaciones), con lo que podemos quitar esta última del análisis al parecer más sencilla de entender la primera de las variables.
Hay una fuerte correlación entre las variables YearRemodAdd y las variables YearBuild y GarageYrBuild. Esto indica que en muchas de ellas el año en que se construyó el garage coincide con el año en que se contruyó la casa. En el caso de la variable YearRemodAdd parece que se ha hecho coincidir con el año de construcción si la casa no ha sufrido reformas.
network_plot(corrmatrix3)
Aqui Observamos una correlación muy fuerte entre las variables GarageCars y GarageArea, con lo que nos podemos quitar la variable GarageCars.Es lógico pensar que el número de coches que caben en una plaza de garage dependa de la superficie de ésta. * Existe una correlacion muy fuerte también entre las variables GrLiveArea y TotRmsAbvGrd (total de habitaciones), con lo que podemos quitar esta última del análisis al parecer más sencilla de entender la primera de las variables. * Hay una fuerte correlación entre las variables YearRemodAdd y las variables YearBuild y GarageYrBuild. Esto indica que en muchas de ellas el año en que se construyó el garage coincide con el año en que se contruyó la casa. En el caso de la variable YearRemodAdd parece que se ha hecho coincidir con el año de construcción si la casa no ha sufrido reformas.
>>>>>>> 1a68e1f32bb9ac5b1b5fd87f9333e892037459b5La siguiente función confirmará nuestras sospechas, buscando variables con fuertes correlaciones entre ellas:
correlacionesProblematicas <- findCorrelation(cor(na.omit(train %>% dplyr::select(var_continuas_discretas))),cutoff = 0.8, verbose = FALSE, names = TRUE)
correlacionesProblematicas
## [1] "1stFlrSF" "GarageCars" "GarageYrBlt"
<<<<<<< HEAD
Comprobamos que, efectivamente, las variables antes comentadas están entre las que aparecen en el listado.
Ahora intentaremos mostrar en un gráfico de barras el grado de correlación entre las variables anteriormente analizadas y la variable objeto de nuestro análisis:
rplot(corrmatrix3, legend = TRUE, shape = 16,print_cor = TRUE)+theme(axis.text.x = element_text(angle = 90))
## Don't know how to automatically pick scale for object of type noquote. Defaulting to continuous.
## Don't know how to automatically pick scale for object of type noquote. Defaulting to continuous.
Comprobamos que, efectivamente, las variables antes comentadas están entre las que aparecen en el listado.
Ahora intentaremos mostrar en un gráfico de barras el grado de correlación entre las variables anteriormente analizadas y la variable objeto de nuestro análisis:
rplot(corrmatrix3, legend = TRUE, shape = 16,print_cor = TRUE)+theme(axis.text.x = element_text(angle = 90))
## Don't know how to automatically pick scale for object of type noquote. Defaulting to continuous.
## Don't know how to automatically pick scale for object of type noquote. Defaulting to continuous.
correlacionesSalesPrice <-focus(corrmatrix3,SalePrice)
correlacionesSalesPrice%>% arrange(SalePrice) %>% ggplot(aes(x=rowname ,y=SalePrice,fill=factor(rowname))) +
geom_bar(position="dodge",stat="identity") +
coord_flip() +
ggtitle("Strategies for Using Homework Solution and Mini-Lecture Screencasts")
<<<<<<< HEAD
En este diagrama se muestra más claramente lo que ya se ha comentado con anterioridad: casi todas las variables tienen correlaciones positivas con el precio excepto unas pocas (sería interesante el averiguar por qué, ya que serían factores que influyen negativamente en el precio de una vivienda). Además las variables con mayores correlaciones tiene que ver con la superficie habitable de la casa y la superficie de la primera planta (lo que muestra que la mayoría de las casas tienen una única planta. El tener una segunda planta influye moderadamente en el precio de la vivienda). También hay correlaciones moderadas entre las características del garage, el año de construcción, la superficie del sótano, etc. Por lo tanto, estas variables deberían entrar significativamente en el modelo de regresión que generemos en esta práctica.
Ahora realizaremos unos cuantos diagramas de dispersión entre las variables contínuas y el precio de la vivienda para ver si existen relaciones lineales entre dichas variables (importante para saber si el modelo de regresión lineal es el más adecuado para el problema que tenemos en esta práctica):
na.omit(train %>% dplyr::select(var_continuas)) %>% plot_scatterplot( by = "SalePrice", sampled_rows = 1000L)
Observamos que sí que existen ciertas relaciones apróximadas pero con algunas anomalías que comentamos a continuación:
Existen muchos valores concentrados en el valor cero para muchas de las variables (es normal, por ejemplo, que haya muchas casas que no tengan segundo piso, por lo que para ellas la variable que contabiliza su superficie sea cero).
Se ven numerosos “outliers” en muchas variables, lo que es indicativo de casas con características especiales, tanto a la baja como al alza. En particular, la variable “LotArea” es un indicativo de casas de lujo para valores extremadamente altos de la misma (en su gráfica se muestran claramente estos “outliers”). Otra de las variables que muestran casas fuera de lo común es “3SsnPorch”, en donde vemos que muy pocas casas la tienen informada con un valor mayor que cero.
En este diagrama se muestra más claramente lo que ya se ha comentado con anterioridad: casi todas las variables tienen correlaciones positivas con el precio excepto unas pocas (sería interesante el averiguar por qué, ya que serían factores que influyen negativamente en el precio de una vivienda). Además las variables con mayores correlaciones tiene que ver con la superficie habitable de la casa y la superficie de la primera planta (lo que muestra que la mayoría de las casas tienen una única planta. El tener una segunda planta influye moderadamente en el precio de la vivienda). También hay correlaciones moderadas entre las características del garage, el año de construcción, la superficie del sótano, etc. Por lo tanto, estas variables deberían entrar significativamente en el modelo de regresión que generemos en esta práctica.
Ahora realizaremos unos cuantos diagramas de dispersión entre las variables contínuas y el precio de la vivienda para ver si existen relaciones lineales entre dichas variables (importante para saber si el modelo de regresión lineal es el más adecuado para el problema que tenemos en esta práctica):
na.omit(train %>% dplyr::select(var_continuas)) %>% plot_scatterplot( by = "SalePrice", sampled_rows = 1000L)
#geom_smooth(method=lm, se=FALSE, fullrange=TRUE)
Observamos que sí que existen ciertas relaciones apróximadas pero con algunas anomalías que comentamos a continuación:
En cuanto a la detección de Outliers, como se ha indicado con anterioridad, existen indicios más que suficientes para inferir que, efectivamente, en este dataset existe más de una casa que podría crear problemas en el modelo de regresión lineal. Para detectarlos y almacenarlos en una lista para su posterior tratamiento, ejecutaremos el siguiente código, que además mostrará un conjunto de diagramas de caja con las variables continuas del dataset:
library(EnvStats)
##
## Attaching package: 'EnvStats'
## The following objects are masked from 'package:moments':
##
## kurtosis, skewness
## The following object is masked from 'package:MASS':
##
## boxcox
## The following objects are masked from 'package:stats':
##
## predict, predict.lm
## The following object is masked from 'package:base':
##
## print.default
listaOutliers <- list()
listaBoxPlots <- c()
dataset_var_continuas <- train %>% dplyr::select(var_continuas)
iterator = 1
for(i in colnames(dataset_var_continuas)) {
outlier_values <- boxplot.stats(dataset_var_continuas[[i]])$out
boxPlotDibujar <- boxplot(dataset_var_continuas[[i]], main=i, boxwex=0.1)
boxPlotDibujar
listaBoxPlots <- c(listaBoxPlots,boxPlotDibujar)
outliersRosen <- rosnerTest(dataset_var_continuas[[i]], k = 4, warn = F)
listaOutliers[[iterator]] <- outliersRosen
iterator<- iterator +1
}
<<<<<<< HEAD
#library(gridExtra)
#n <- length(listaBoxPlots)
#nCol <- floor(sqrt(n))
#do.call("grid.arrange", c(listaBoxPlots, ncol=nCol))
#for(i in listaOutliers) {
# print(c(i$data.name,i$n.outliers))
#}
>>>>>>> 1a68e1f32bb9ac5b1b5fd87f9333e892037459b5
A continuación, almaceneramos en un conjunto de variables todas las recomendaciones que se han hecho en este punto para proceder en partes posteriores de la práctica a llevar a cabo dichas recomendaciones (eliminar columnas del modelo por posibilidad de autocorrelacines, eliminacion de columnas varias por baja varianza de las mismas, etc).
var_modelo_with_SalePrice = c(var_modelo,'SalePrice')
var_columnas_eliminadas = c('TotRmsAbvGrd','GarageYrBlt','GarageCars','TotalBsmtSF','1stFlrSF','2ndFlrSF','BsmtFinSF2','1stFlrSF','2ndFlrSF','FullBath','HalfBath','BsmtFullBath','BsmtHalfBath','OpenPorchSF','3SsnPorch','EnclosedPorch','ScreenPorch','WoodDeckSF','GarageFinish','hasBasement','hasFirePlaces','LotFrontage')
var_columnas_eliminadas_bajo_p_valor = c('LandSlope')
var_transformacion_log = c('TotalSF')
var_eliminar_correlacion = c('TotRmsAbvGrd','GarageYrBlt','GarageCars')
<<<<<<< HEAD
Ahora procederemos a realizar el procesado de las variables cuantitativas, tanto contínuas como discretas. Lo primero que haremos será contruir 3 nuevas variables como sigue: * TotalSF : será la suma de pies cuadrados entre sótano, primera planta y segunda planta. * Total_Bathrooms: llevará cuenta del número total de cuartos de baño existentes en la casa, contabilizando los baños pequeños con un peso inferior. * Total_porch_SF: llevará cuente del número todal de pies cuadrados existentes en los diferentes porches.
Evidentemente, estas variables sustituyen en el modemo final a las variables de las que se componen. Para no destruir información, además, en el apartado de procesado de variables cualitativas crearemos nuevas variables facetadas que indiquen si una casa tiene segundo piso y porche, porque no todas las casas tienen estas dos características. Así nos quitamos el problema que vimos en el apartado de análisis exploratorio con numerosos ceros en algunas de estas variables.
train <- train %>% dplyr::mutate( TotalSF = TotalBsmtSF + `1stFlrSF` + `2ndFlrSF` )
train <- train %>% dplyr::mutate( Total_Bathrooms = FullBath + 0.5*HalfBath + BsmtFullBath + 0.5*BsmtHalfBath )
train <- train %>% dplyr::mutate( Total_porch_SF = OpenPorchSF +`3SsnPorch` + EnclosedPorch + ScreenPorch + WoodDeckSF )
Otro procesamiento que realizaremos sobre estas variables es cuantificar las variables que portan los años de reforma y construcción de la casa en rangos de 30 años, para simplificar el modelo final generado. Esta cuantificación transformará estas variables en variables categóricas. El código que realiza la transformación es el siguiente:
# YearBuilt: discretizamos la variable en tramos
# YearRemodAdd: discretizamos la variable en tramos
train$YearBuilt <- cut(train$YearBuilt,
breaks=c(-Inf, 1930, 1960, 1990,Inf),
labels=c("1900_1930","1930_1960","1960_1990","1990_"))
test$YearBuilt <- cut(test$YearBuilt,
breaks=c(-Inf, 1930, 1960, 1990,Inf),
labels=c("1900_1930","1930_1960","1960_1990","1990_"))
validation$YearBuilt <- cut(validation$YearBuilt,
breaks=c(-Inf, 1930, 1960, 1990,Inf),
labels=c("1900_1930","1930_1960","1960_1990","1990_"))
train$YearRemodAdd <- cut(train$YearRemodAdd,
breaks=c(-Inf, 1930, 1960, 1990,Inf),
labels=c("1900_1930","1930_1960","1960_1990","1990_"))
test$YearRemodAdd <- cut(test$YearRemodAdd,
breaks=c(-Inf, 1930, 1960, 1990,Inf),
labels=c("1900_1930","1930_1960","1960_1990","1990_"))
validation$YearRemodAdd <- cut(validation$YearRemodAdd,
breaks=c(-Inf, 1930, 1960, 1990,Inf),
labels=c("1900_1930","1930_1960","1960_1990","1990_"))
Continuaremos este apartado realizando la transformación logarítmica tanto de la variable SalePrice como de las variables con alto grado de asimetría. Debido a que algunas de estas variables tienen valores nulos, sumaremos uno a la funció logarítmica para evitar errores en el cálculo del logaritmo. El siguiente código realiza estas transformaciones:
log_transform<- function(x, na.rm=FALSE) (log(x +1))
variablesTransformar = names(variablesSkewnessAlto)[!names(variablesSkewnessAlto) %in% var_columnas_eliminadas & !names(variablesSkewnessAlto) %in% var_eliminar_correlacion ]
#variablesTransformar <- c(variablesTransformar,'TotalSF')
for(i in 1:ncol(train)){
nombreCol = names(train)[i]
if(nombreCol == 'MasVnrArea' | nombreCol == 'MiscVal' | nombreCol == 'SaleCondition' ) {
} else
if (nombreCol %in% variablesTransformar & nombreCol != 'SalePrice'){
train[,i] <- log(train[,i] +1)
#test[,i] <- log(test[,i] +1)
#validation[,i] <- log(validation[,i] +1)
} else if(nombreCol == 'SalePrice'){
train[,i] <- log(train[,i])
#test[,i] <- log(test[,i])
#validation[,i] <- log(validation[,i])
}else if(nombreCol == 'TotalSF'){
train[,i] <- log(train[,i])
#test[,i] <- log(test[,i])
#validation[,i] <- log(validation[,i])
}
}
for(i in 1:ncol(test)){
nombreCol = names(test)[i]
=======
- Transformaciones de variables cuantitativas (1 punto)
Ahora procederemos a realizar el procesado de las variables cuantitativas, tanto contínuas como discretas. Lo primero que haremos será contruir 3 nuevas variables como sigue: * TotalSF : será la suma de pies cuadrados entre sótano, primera planta y segunda planta. * Total_Bathrooms: llevará cuenta del número total de cuartos de baño existentes en la casa, contabilizando los baños pequeños con un peso inferior. * Total_porch_SF: llevará cuente del número todal de pies cuadrados existentes en los diferentes porches.
Evidentemente, estas variables sustituyen en el modemo final a las variables de las que se componen. Para no destruir información, además, en el apartado de procesado de variables cualitativas crearemos nuevas variables facetadas que indiquen si una casa tiene segundo piso y porche, porque no todas las casas tienen estas dos características. Así nos quitamos el problema que vimos en el apartado de análisis exploratorio con numerosos ceros en algunas de estas variables.
train <- train %>% dplyr::mutate( TotalSF = TotalBsmtSF + `1stFlrSF` + `2ndFlrSF` )
train <- train %>% dplyr::mutate( Total_Bathrooms = FullBath + 0.5*HalfBath + BsmtFullBath + 0.5*BsmtHalfBath )
train <- train %>% dplyr::mutate( Total_porch_SF = OpenPorchSF +`3SsnPorch` + EnclosedPorch + ScreenPorch + WoodDeckSF )
#train <- train %>% dplyr::mutate( TotalSqrFootage = BsmtFinSF1 + BsmtFinSF2 + !!as.symbol(firsrtFlrSF) + #!!as.symbol(secondFlrSF) )
test <- test %>% dplyr::mutate( TotalSF = TotalBsmtSF + `1stFlrSF` + `2ndFlrSF` )
test <- test %>% dplyr::mutate( Total_Bathrooms = FullBath + 0.5*HalfBath + BsmtFullBath + 0.5*BsmtHalfBath )
test <- test %>% dplyr::mutate( Total_porch_SF = OpenPorchSF +`3SsnPorch` + EnclosedPorch + ScreenPorch + WoodDeckSF )
#test <- test %>% dplyr::mutate( TotalSqrFootage = BsmtFinSF1 + BsmtFinSF2 + !!as.symbol(firsrtFlrSF) + #!!as.symbol(secondFlrSF) )
# esta variable tiene los pies cuadrados "oficiales" del interior de la casa
validation <- validation %>% dplyr::mutate( TotalSF = TotalBsmtSF + `1stFlrSF` + `2ndFlrSF` )
# esta variable tiene los pies cuadrados de los cuartos de baño de la casa
validation<- validation %>% dplyr::mutate( Total_Bathrooms = FullBath + 0.5*HalfBath + BsmtFullBath + 0.5*BsmtHalfBath )
# esta variable tiene los pies cuadrados del porche
validation <- validation %>% dplyr::mutate( Total_porch_SF = OpenPorchSF +`3SsnPorch` + EnclosedPorch + ScreenPorch + WoodDeckSF )
# esta variable tiene los pies cuadrados finalizados de la casa (tiene en cuenta las variables de sotano acabado y no tiene en cuenta la variable TotalBsmtSF)
#train_test <- train_test %>% dplyr::mutate( TotalSqrFootage = BsmtFinSF1 + BsmtFinSF2 + TotalBsmtSF+ #!!as.symbol(firsrtFlrSF) + !!as.symbol(secondFlrSF) )
var_creadas_transformacion = c( 'TotalSF','Total_Bathrooms','Total_porch_SF','TotalSqrFootage','hasPool','hasGarage','hasBasement','hasFirePlaces','has2ndFloor')
Otro procesamiento que realizaremos sobre estas variables es cuantificar las variables que portan los años de reforma y construcción de la casa en rangos de 30 años, para simplificar el modelo final generado. Esta cuantificación transformará estas variables en variables categóricas. El código que realiza la transformación es el siguiente:
# YearBuilt: discretizamos la variable en tramos
# YearRemodAdd: discretizamos la variable en tramos
train$YearBuilt <- cut(train$YearBuilt,
breaks=c(-Inf, 1930, 1960, 1990,Inf),
labels=c("1900_1930","1930_1960","1960_1990","1990_"))
test$YearBuilt <- cut(test$YearBuilt,
breaks=c(-Inf, 1930, 1960, 1990,Inf),
labels=c("1900_1930","1930_1960","1960_1990","1990_"))
validation$YearBuilt <- cut(validation$YearBuilt,
breaks=c(-Inf, 1930, 1960, 1990,Inf),
labels=c("1900_1930","1930_1960","1960_1990","1990_"))
train$YearRemodAdd <- cut(train$YearRemodAdd,
breaks=c(-Inf, 1930, 1960, 1990,Inf),
labels=c("1900_1930","1930_1960","1960_1990","1990_"))
test$YearRemodAdd <- cut(test$YearRemodAdd,
breaks=c(-Inf, 1930, 1960, 1990,Inf),
labels=c("1900_1930","1930_1960","1960_1990","1990_"))
validation$YearRemodAdd <- cut(validation$YearRemodAdd,
breaks=c(-Inf, 1930, 1960, 1990,Inf),
labels=c("1900_1930","1930_1960","1960_1990","1990_"))
Continuaremos este apartado realizando la transformación logarítmica tanto de la variable SalePrice como de las variables con alto grado de asimetría. Debido a que algunas de estas variables tienen valores nulos, sumaremos uno a la funció logarítmica para evitar errores en el cálculo del logaritmo. El siguiente código realiza estas transformaciones:
log_transform<- function(x, na.rm=FALSE) (log(x +1))
variablesTransformar = names(variablesSkewnessAlto)[!names(variablesSkewnessAlto) %in% var_columnas_eliminadas & !names(variablesSkewnessAlto) %in% var_eliminar_correlacion ]
#variablesTransformar <- c(variablesTransformar,'TotalSF')
for(i in 1:ncol(train)){
nombreCol = names(train)[i]
>>>>>>> 1a68e1f32bb9ac5b1b5fd87f9333e892037459b5
if(nombreCol == 'MasVnrArea' | nombreCol == 'MiscVal' | nombreCol == 'SaleCondition' ) {
} else
if (nombreCol %in% variablesTransformar & nombreCol != 'SalePrice'){
<<<<<<< HEAD
#train[,i] <- log(train[,i] +1)
test[,i] <- log(test[,i] +1)
#validation[,i] <- log(validation[,i] +1)
} else if(nombreCol == 'SalePrice'){
#train[,i] <- log(train[,i])
test[,i] <- log(test[,i])
#validation[,i] <- log(validation[,i])
}else if(nombreCol == 'TotalSF'){
#train[,i] <- log(train[,i])
test[,i] <- log(test[,i])
=======
train[,i] <- log(train[,i] +1)
#test[,i] <- log(test[,i] +1)
#validation[,i] <- log(validation[,i] +1)
} else if(nombreCol == 'SalePrice'){
train[,i] <- log(train[,i])
#test[,i] <- log(test[,i])
#validation[,i] <- log(validation[,i])
}else if(nombreCol == 'TotalSF'){
train[,i] <- log(train[,i])
#test[,i] <- log(test[,i])
>>>>>>> 1a68e1f32bb9ac5b1b5fd87f9333e892037459b5
#validation[,i] <- log(validation[,i])
}
}
<<<<<<< HEAD
=======
for(i in 1:ncol(test)){
nombreCol = names(test)[i]
if(nombreCol == 'MasVnrArea' | nombreCol == 'MiscVal' | nombreCol == 'SaleCondition' ) {
} else
if (nombreCol %in% variablesTransformar & nombreCol != 'SalePrice'){
#train[,i] <- log(train[,i] +1)
test[,i] <- log(test[,i] +1)
#validation[,i] <- log(validation[,i] +1)
} else if(nombreCol == 'SalePrice'){
#train[,i] <- log(train[,i])
test[,i] <- log(test[,i])
#validation[,i] <- log(validation[,i])
}else if(nombreCol == 'TotalSF'){
#train[,i] <- log(train[,i])
test[,i] <- log(test[,i])
#validation[,i] <- log(validation[,i])
}
}
>>>>>>> 1a68e1f32bb9ac5b1b5fd87f9333e892037459b5
for(i in 1:ncol(validation)){
nombreCol = names(validation)[i]
if(nombreCol == 'MasVnrArea' | nombreCol == 'MiscVal' | nombreCol == 'SaleCondition' ) {
} else
if (nombreCol %in% variablesTransformar & nombreCol != 'SalePrice'){
#train[,i] <- log(train[,i] +1)
#test[,i] <- log(test[,i] +1)
validation[,i] <- log(validation[,i] +1)
} else if(nombreCol == 'SalePrice'){
train[,i] <- log(train[,i])
#test[,i] <- log(test[,i])
validation[,i] <- log(validation[,i])
}else if(nombreCol == 'TotalSF'){
train[,i] <- log(train[,i])
#test[,i] <- log(test[,i])
validation[,i] <- log(validation[,i])
}
}
Por último, realizaremos un normalizado de las variables para intentar que tengan media 0 y desviación típica 1, pero esa normalización se realizará en el siguiente punto una vez se hayan tratado las variables cualitativas y se hayan creado las variables de tipo factor que sean necesarias.
- Procesado de variables cualitativas (1 punto)
Comenzaremos este apartado creando las siguientes variables como complemento a la información en pies cuadrados de las distintas partes que componen una vivienda:
- hasPool : variable categórica que indica si la vivienda tiene piscina o no.
- hasBasement : variable categórica que indica si la vivienda tiene sótano o no.
- has2ndFloor: variable categórica que indica si la vivienda tiene segunda planta o no.
Habrá que tener cuidado con estas variables al añadirlas al modelo porque podrían estar altamente correladas con las variables que indican el tamaño en superficie de estos 3 elementos.
#MSSubClass:
test <- test %>% dplyr::mutate( hasPool := ifelse(PoolArea > 0, "True", "False"))
train <- train %>% dplyr::mutate( hasPool := ifelse(PoolArea > 0, "True", "False"))
validation <- validation %>% dplyr::mutate( hasPool := ifelse(PoolArea > 0, "True", "False"))
#test <- test %>% dplyr::mutate( hasGarage := ifelse(GarageArea > 0, "True", "False"))
#train <- train %>% dplyr::mutate( hasGarage := ifelse(GarageArea > 0, "True", "False"))
test <- test %>% dplyr::mutate( hasBasement := ifelse(TotalBsmtSF > 0, "True", "False"))
train <- train %>% dplyr::mutate( hasBasement := ifelse(TotalBsmtSF > 0, "True", "False"))
validation <- validation %>% dplyr::mutate( hasBasement := ifelse(TotalBsmtSF > 0, "True", "False"))
test <- test %>% dplyr::mutate( hasFirePlaces := ifelse(Fireplaces > 0, "True", "False"))
train <- train %>% dplyr::mutate( hasFirePlaces := ifelse(Fireplaces > 0, "True", "False"))
validation <- validation %>% dplyr::mutate( hasFirePlaces := ifelse(Fireplaces > 0, "True", "False"))
test <- test %>% dplyr::mutate( has2ndFloor := ifelse(`2ndFlrSF` > 0, "True", "False"))
train <- train %>% dplyr::mutate( has2ndFloor := ifelse(`2ndFlrSF` > 0, "True", "False"))
validation <- validation %>% dplyr::mutate( has2ndFloor := ifelse( `2ndFlrSF` > 0, "True", "False"))
A continuación transformaremos en columnas de tipo Factor aquellas que tiene valores alfanuméricos y que no parece que tengan un orden natural:
library(plyr)
## ------------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## ------------------------------------------------------------------------------
##
## Attaching package: 'plyr'
## The following object is masked from 'package:ggpubr':
##
## mutate
## The following object is masked from 'package:purrr':
##
## compact
## The following objects are masked from 'package:dplyr':
##
## arrange, count, desc, failwith, id, mutate, rename, summarise,
## summarize
nombresVariablesFactores <- c('MiscFeature','Alley','Fence','LotConfig','GarageType','MSZoning','Exterior1st','Exterior2nd','Electrical','SaleType','SaleCondition','Foundation','Heating','RoofStyle',
'RoofMatl','LandContour','BldgType','HouseStyle','Neighborhood','Condition1','Condition2','MoSold','YrSold','Street','LotShape','Utilities','LandSlope','MasVnrType','BsmtFinType2','CentralAir','Functional','PavedDrive','hasPool','hasBasement','hasFirePlaces')
for(i in nombresVariablesFactores){
train[[i]] <- as.factor(train[[i]])
test[[i]] <- as.factor(test[[i]])
validation[[i]] <- as.factor( validation[[i]])
}
train$MSSubClass <- as.factor(train$MSSubClass)
train$MSSubClass<-revalue(train$MSSubClass, c('20'='1_story_1946_', '30'='1_story_1945_', '40'='1_story_unf_attic', '45'='1_5_story_unf', '50'='1_5 story_fin', '60'='2_story_1946_', '70'='2_story_1945_', '75'='2_5_story_all_ages', '80'='split_multi_level', '85'='split_foyer', '90'='duplex_all_style_age', '120'='1_story_PUD_1946_', '150'='1_5_story_PUD_all', '160'='2_story_PUD_1946', '180'='PUD_multilevel', '190'='2_family_conversion'))
## The following `from` values were not present in `x`: 150
test$MSSubClass <- as.factor(test$MSSubClass)
test$MSSubClass<-revalue(test$MSSubClass, c('20'='1_story_1946_', '30'='1_story_1945_', '40'='1_story_unf_attic', '45'='1_5_story_unf', '50'='1_5 story_fin', '60'='2_story_1946_', '70'='2_story_1945_', '75'='2_5_story_all_ages', '80'='split_multi_level', '85'='split_foyer', '90'='duplex_all_style_age', '120'='1_story_PUD_1946_', '150'='1_5_story_PUD_all', '160'='2_story_PUD_1946', '180'='PUD_multilevel', '190'='2_family_conversion'))
validation$MSSubClass <- as.factor(validation$MSSubClass)
validation$MSSubClass<-revalue(validation$MSSubClass, c('20'='1_story_1946_', '30'='1_story_1945_', '40'='1_story_unf_attic', '45'='1_5_story_unf', '50'='1_5 story_fin', '60'='2_story_1946_', '70'='2_story_1945_', '75'='2_5_story_all_ages', '80'='split_multi_level', '85'='split_foyer', '90'='duplex_all_style_age', '120'='1_story_PUD_1946_', '150'='1_5_story_PUD_all', '160'='2_story_PUD_1946', '180'='PUD_multilevel', '190'='2_family_conversion'))
## The following `from` values were not present in `x`: 150
Y por último, todas las variables que encierran una relación de orden en ellas (por ejemplo, que sirven para cuantificar una característica de peor a mejor), se convierten en variables de tipo factor, pero estableciendo los distintos niveles de 0 a el valor máximo en función del valor que representan. El siguiente código realiza dicha transformación.
#OverallQual, OverallCond (dejarlas como estan)
levesl1_10 <- c("Very Poor","Poor","Fair","Below Average","Average","Above Average","Good","Very Good","Excellent","Very Excellent")
#ExterQual , ExterCond , HeatingQC, KitchenQual,GarageQual,GarageCond
return_position1_5 <- function(elements) {
levesl1_5 <- c('Po','Fa','TA','Gd','Ex')
pos <- match(elements,levesl1_5)
elem <- which(levesl1_5 %in% elements)
return(levesl1_5[elem])
}
#BsmtQual,BsmtCond,FireplaceQu
return_position1_6 <- function(elements) {
levesl1_6 <- c('NA','Po','Fa','TA','Gd','Ex')
pos <- match(elements,levesl1_6)
elem <- which(levesl1_6 %in% elements)
return(levesl1_6[elem])
}
#BsmtExposure
return_position1_5_B <- function(elements) {
levesl1_5_B <- c('NA','No','Mn','Av','Gd')
pos <- match(elements,levesl1_5_B)
elem <- which(levesl1_5_B %in% elements)
return(levesl1_5_B[elem])
}
#BsmtFinType1 , BsmtFinType2
return_position1_7 <- function(elements) {
levesl1_7 <- c('NA','Unf','LwQ','Rec','BLQ','ALQ','GLQ')
pos <- match(elements,levesl1_7)
elem <- which(levesl1_7 %in% elements)
return(levesl1_7[elem])
}
#CentralAir
levesl_2 <- c('N','Y')
#GarageFinish
return_levels_garage <- function(elements) {
levels_garage <-c('NA','Unf','RFn','Fin')
pos <- match(elements,levels_garage)
elem <- which(levels_garage %in% elements)
return(levels_garage[elem])
}
# PoolQC
return_levesl_poolQC <- function(elements) {
levesl_poolQC <- c('NA','Fa','TA','Gd','Ex')
pos <- match(elements,levesl_poolQC)
elem <- which(levesl_poolQC %in% elements)
return(levesl_poolQC[elem])
}
library(forcats)
#OverallCond
train <- train %>% dplyr::mutate( ExterQual:=fct_relevel(ExterQual,return_position1_5))
test <- test %>% dplyr::mutate( ExterQual:=fct_relevel(ExterQual,return_position1_5))
validation <- validation %>% dplyr::mutate( ExterQual:=fct_relevel(ExterQual,return_position1_5))
#ExterCond ,
train <- train %>% dplyr::mutate( ExterCond := fct_relevel(ExterCond,return_position1_5))
test <- test %>% dplyr::mutate( ExterCond := fct_relevel(ExterCond,return_position1_5))
validation <- validation %>% dplyr::mutate( ExterCond := fct_relevel(ExterCond,return_position1_5))
#HeatingQC,
train <- train %>% dplyr::mutate( HeatingQC := fct_relevel(HeatingQC,return_position1_5))
test <- test %>% dplyr::mutate( HeatingQC := fct_relevel(HeatingQC,return_position1_5))
validation <- validation %>% dplyr::mutate( HeatingQC := fct_relevel(HeatingQC,return_position1_5))
#KitchenQual,
train <- train %>% dplyr::mutate( KitchenQual := fct_relevel(KitchenQual,return_position1_5))
test <- test %>% dplyr::mutate( KitchenQual := fct_relevel(KitchenQual,return_position1_5))
validation <- validation %>% dplyr::mutate( KitchenQual := fct_relevel(KitchenQual,return_position1_5))
#GarageQual,
train <- train %>% dplyr::mutate( GarageQual := fct_relevel(GarageQual,return_position1_5))
test <- test %>% dplyr::mutate( GarageQual := fct_relevel(GarageQual,return_position1_5))
validation <- validation %>% dplyr::mutate( GarageQual := fct_relevel(GarageQual,return_position1_5))
#GarageCond
train <- train %>% dplyr::mutate( GarageCond := fct_relevel(GarageCond,return_position1_5))
test <- test %>% dplyr::mutate( GarageCond := fct_relevel(GarageCond,return_position1_5))
validation <- validation %>% dplyr::mutate( GarageCond := fct_relevel(GarageCond,return_position1_5))
#BsmtQual
train <- train %>% dplyr::mutate( BsmtQual := fct_relevel(BsmtQual,return_position1_6))
test <- test %>% dplyr::mutate( BsmtQual := fct_relevel(BsmtQual,return_position1_6))
validation <- validation %>% dplyr::mutate( BsmtQual := fct_relevel(BsmtQual,return_position1_6))
#BsmtCond,
train <- train %>% dplyr::mutate( BsmtCond := fct_relevel(BsmtCond,return_position1_6))
test <- test %>% dplyr::mutate( BsmtCond := fct_relevel(BsmtCond,return_position1_6))
validation <- validation %>% dplyr::mutate( BsmtCond := fct_relevel(BsmtCond,return_position1_6))
#FireplaceQu
train <- train %>% dplyr::mutate(FireplaceQu := fct_relevel(FireplaceQu,return_position1_6))
test <- test %>% dplyr::mutate(FireplaceQu := fct_relevel(FireplaceQu,return_position1_6))
validation <- validation %>% dplyr::mutate(FireplaceQu := fct_relevel(FireplaceQu,return_position1_6))
#BsmtExposure
train <- train %>% dplyr::mutate( BsmtExposure := fct_relevel(BsmtExposure,return_position1_5_B))
test <- test %>% dplyr::mutate( BsmtExposure := fct_relevel(BsmtExposure,return_position1_5_B))
validation <- validation %>% dplyr::mutate( BsmtExposure := fct_relevel(BsmtExposure,return_position1_5_B))
#BsmtFinType1
train <- train %>% dplyr::mutate( BsmtFinType1 := fct_relevel(BsmtFinType1,return_position1_7))
test <- test %>% dplyr::mutate( BsmtFinType1 := fct_relevel(BsmtFinType1,return_position1_7))
validation <- validation %>% dplyr::mutate( BsmtFinType1 := fct_relevel(BsmtFinType1,return_position1_7))
#BsmtFinType2
train <- train %>% dplyr::mutate( BsmtFinType1 := fct_relevel(BsmtFinType2,return_position1_7))
test <- test %>% dplyr::mutate( BsmtFinType1 := fct_relevel(BsmtFinType2,return_position1_7))
validation <- validation %>% dplyr::mutate( BsmtFinType1 := fct_relevel(BsmtFinType2,return_position1_7))
#GarageFinish
train <- train %>% dplyr::mutate( GarageFinish := fct_relevel(GarageFinish,return_levels_garage))
test <- test %>% dplyr::mutate( GarageFinish := fct_relevel(GarageFinish,return_levels_garage))
validation <- validation %>% dplyr::mutate( GarageFinish := fct_relevel(GarageFinish,return_levels_garage))
# PoolQC
train <- train %>% dplyr::mutate( PoolQC := fct_relevel(PoolQC,return_levesl_poolQC))
test <- test %>% dplyr::mutate( PoolQC := fct_relevel(PoolQC,return_levesl_poolQC))
validation <- validation %>% dplyr::mutate( PoolQC := fct_relevel(PoolQC,return_levesl_poolQC))
# para dummify variables si es necesario tenemos esta funcion del paquete dataexplorer
#train <- dummify(train, maxcat = 50L, select = var_nominales)
Y por último, trataremos de centrar y normalizar todas las variables numéricas una vez convertidas en factores en los anteriores pasos. Esto se realizará pensando sobre todo en el paso de aplicación del método de selección de variables “lasso”, que exige que todas las variables numéricas tengan varianza 1 para evitar sesgos en el modelo resultante. El siguiente código realizará esta función:
train_sin_na <- train %>% na.omit() %>% dplyr::select(-Id)
preProcValuesTrain <- preProcess(train_sin_na %>% dplyr::select(-OverallQual, -OverallCond),method = c("center", "scale"))
test_sin_na <- test %>% na.omit() %>% dplyr::select(-Id)
preProcValuesTest <- preProcess(test_sin_na %>% dplyr::select(-OverallQual, -OverallCond),method = c("center", "scale"))
## Warning in preProcess.default(test_sin_na %>% dplyr::select(-OverallQual, :
## These variables have zero variances: PoolArea
validation_sin_na <- validation %>% na.omit() %>% dplyr::select(-Id)
preProcValuesValidation <- preProcess(validation_sin_na %>% dplyr::select(-OverallQual, -OverallCond),method = c("center", "scale"))
## Warning in `[<-.data.frame`(`*tmp*`, , method$center, value = structure(list(:
## provided 1089 variables to replace 33 variables
## Warning in preProcess.default(validation_sin_na %>% dplyr::select(-
## OverallQual, : Std. deviations could not be computed for: LotFrontage, LotArea,
## MasVnrArea, BsmtFinSF1, BsmtFinSF2, BsmtUnfSF, TotalBsmtSF, 1stFlrSF, 2ndFlrSF,
## LowQualFinSF, GrLivArea, BsmtFullBath, BsmtHalfBath, FullBath, HalfBath,
## BedroomAbvGr, KitchenAbvGr, TotRmsAbvGrd, Fireplaces, GarageYrBlt, GarageCars,
## GarageArea, WoodDeckSF, OpenPorchSF, EnclosedPorch, 3SsnPorch, ScreenPorch,
## PoolArea, MiscVal, SalePrice, TotalSF, Total_Bathrooms, Total_porch_SF
## Warning in `[<-.data.frame`(`*tmp*`, , method$scale, value = structure(list(:
## provided 1089 variables to replace 33 variables
<<<<<<< HEAD
Teniendo en cuanto todo lo dicho en los anteriores apartados, las variables con las que al final nos quedaremos para el cálculo del modelo final serán las siguientes:
var_modelo = c( 'TotalSF','GrLivArea','LotArea','Total_Bathrooms','Total_porch_SF','MSZoning','Alley','LandContour','LotConfig','Condition1','BldgType','HouseStyle','RoofStyle','Exterior1st','Exterior2nd','MasVnrType','Foundation','Heating','SaleType','SaleCondition','YearBuilt','YearRemodAdd','MasVnrArea','MoSold','YrSold','OverallQual','OverallCond','PavedDrive','PoolArea','PoolQC','Fence','BsmtFinSF1','Electrical','Functional','ExterCond','ExterQual','BsmtQual','BsmtExposure','BsmtFinType1','BsmtUnfSF','HeatingQC','CentralAir','KitchenQual','Fireplaces','FireplaceQu','BedroomAbvGr','KitchenAbvGr','LotShape','GarageType','GarageArea','GarageQual','GarageCond','Neighborhood','hasPool','has2ndFloor','Total_porch_SF')
var_modelo_with_SalePrice = c(var_modelo,'SalePrice')
Ahora eliminaremos la columna Id de los datasets para que no intervenga en el modelo y lo recalcularemos con las variables anteriormente comentadas:
train_sin_na <- train %>% na.omit() %>% dplyr::select(-Id)
test_sin_na <- test %>% na.omit() %>% dplyr::select(-Id)
validation_sin_na <- validation %>% na.omit() %>% dplyr::select(-Id)
trainTransformed <- predict(preProcValuesTrain, train_sin_na)
testTransformed <- predict(preProcValuesTest, test_sin_na)
validationTransformed <- predict(preProcValuesValidation, validation_sin_na)
## Warning in `[<-.data.frame`(`*tmp*`, , object$method$center, value =
## structure(list(: provided 1089 variables to replace 33 variables
## Warning in `[<-.data.frame`(`*tmp*`, , object$method$scale, value =
## structure(list(: provided 1089 variables to replace 33 variables
modelRegressionTotal <- lm(reformulate(termlabels = var_modelo, response = 'SalePrice') ,data=trainTransformed)
cat('El modelo total usa', length(modelRegressionTotal$coefficients), 'variables ')
## El modelo total usa 228 variables
#summary( modelRegressionTotal )
#predict(modelRegressionTotal,testTransformed)
A continuación, intentaremos reducir la elevada dimensionalidad del modelo utilizando la libreria Caret y haciendo una regresión de tipo “Step Backward selection”, es decir, utilizando el algoritmo que partiendo de todas las variables del modelo vaya creando nuevos modelos quitando cada vez una de las variables que contengan el estimador menos influyente en el modelo hasta converger. Para ello primero relalizamos la codificacion de las varibales categóricas en variables de tipo “dummy”:
dummiesTrain <- dummyVars(reformulate(termlabels = var_modelo_with_SalePrice ),fullRank = T, data = data.frame(trainTransformed),sep='.')
<<<<<<< HEAD
dummiesTest <- dummyVars(reformulate(termlabels = var_modelo_with_SalePrice ),fullRank = T, data = data.frame(testTransformed),sep='.')
trainTransformedDummies <- predict(dummiesTrain, newdata = trainTransformed)
=======
dummiesTest <- dummyVars(reformulate(termlabels = var_modelo_with_SalePrice ),fullRank = T, data = data.frame(testTransformed),sep='.')
trainTransformedDummies <- predict(dummiesTrain, newdata = trainTransformed)
>>>>>>> 1a68e1f32bb9ac5b1b5fd87f9333e892037459b5
testTransformedDummies <- predict(dummiesTest, newdata = testTransformed)
El siguiente código teóricamente realiza esa funcionalidad, pero hemos tenido problemas al ejecutarlo debido a que codifica los valores de variables categóricas con espacios de distinta forma que el algoritmo “predict” utilizado en el anterior apartado. Dejamos el código en la práctica para que quede constancia de que por lo menos lo hemos intentado, pero ha dado un montón de problemas y no termina de funcinar correctamente por razones desconocidas:
#set.seed(123)
# Set up repeated k-fold cross-validation
#train.control <- trainControl(method = "cv", number = 10)
# Train the model
#step.model <- train(reformulate(termlabels = var_modelo, response = 'SalePrice'), data = #data.frame(trainTransformed) ,method = "leapBackward", tuneGrid = data.frame(nvmax = #60:200),trControl = train.control,sep = '.')
#step.model$bestTune
#step.model$results
#summary(step.model$finalModel)
#step_coef <- coef(step.model$finalModel, step.model$bestTune$nvmax)
#lm_formula <- as.formula(gsub("[[:space:]]","",str_replace(paste("SalePrice~",paste(names(step_c#oef)[-1] , collapse="+"), sep = ""),'&','.'),))
#modelStepForward <- lm(lm_formula, data = data.frame(trainTransformedDummies))
#summary(step.model)
#prediccion <- predict(step.model$finalModel,data.frame(testTransformedDummies))
#par(mfrow=c(2,2))
#plot(modelStepForward)
#plot(modelStepForward,4,id.n=5)
#plot(modelStepForward,5,id.n=5)
<<<<<<< HEAD
Debido al fracaso del anterior modelo, lo intentaremos con una librería distinta que parece que funciona mejor. No obstante, en la ejecución de la misma nos indica que en la selección de variables realizadas siguen existiendo variables correladas.
=======Al final, al realizar un predict del anterior modelo, da el siguiente error: Error: C stack usage 7971332 is too close to the limit
Debido al fracaso del anterior modelo, lo intentaremos con una librería distinta que parece que funciona mejor. No obstante, en la ejecución de la misma nos indica que en la selección de variables realizadas siguen existiendo variables correladas.
library('olsrr')
##
## Attaching package: 'olsrr'
## The following object is masked from 'package:MASS':
##
## cement
## The following object is masked from 'package:datasets':
##
## rivers
>>>>>>> 1a68e1f32bb9ac5b1b5fd87f9333e892037459b5
modelStepForward <- ols_step_forward_p(modelRegressionTotal)
## Forward Selection Method
## ---------------------------
##
## Candidate Terms:
##
## 1. TotalSF
## 2. GrLivArea
## 3. LotArea
## 4. Total_Bathrooms
## 5. Total_porch_SF
## 6. MSZoning
## 7. Alley
## 8. LandContour
## 9. LotConfig
## 10. Condition1
## 11. BldgType
## 12. HouseStyle
## 13. RoofStyle
## 14. Exterior1st
## 15. Exterior2nd
## 16. MasVnrType
## 17. Foundation
## 18. Heating
## 19. SaleType
## 20. SaleCondition
## 21. YearBuilt
## 22. YearRemodAdd
## 23. MasVnrArea
## 24. MoSold
## 25. YrSold
## 26. OverallQual
## 27. OverallCond
## 28. PavedDrive
## 29. PoolArea
## 30. PoolQC
## 31. Fence
## 32. BsmtFinSF1
## 33. Electrical
## 34. Functional
## 35. ExterCond
## 36. ExterQual
## 37. BsmtQual
## 38. BsmtExposure
## 39. BsmtFinType1
## 40. BsmtUnfSF
## 41. HeatingQC
## 42. CentralAir
## 43. KitchenQual
## 44. Fireplaces
## 45. FireplaceQu
## 46. BedroomAbvGr
## 47. KitchenAbvGr
## 48. LotShape
## 49. GarageType
## 50. GarageArea
## 51. GarageQual
## 52. GarageCond
## 53. Neighborhood
## 54. hasPool
## 55. has2ndFloor
##
## We are selecting variables based on p value...
##
## Variables Entered:
##
## - TotalSF
## - OverallQual
## - LotArea
## - GrLivArea
## - YearBuilt
## - OverallCond
## - Heating
## - Neighborhood
## - KitchenAbvGr
## - BedroomAbvGr
## - BsmtQual
## - LandContour
## - MasVnrType
## - Total_Bathrooms
## - Functional
## - MSZoning
## - LotShape
## - KitchenQual
## - PavedDrive
## - BsmtFinSF1
## - GarageArea
## - PoolQC
## - SaleType
## - Fireplaces
## - PoolArea
## - hasPool
## - BldgType
## - YrSold
## - Total_porch_SF
## - Exterior1st
## Note: model has aliased coefficients
## sums of squares computed by model comparison
##
## No more variables to be added.
##
## Final Model Output
## ------------------
##
## Model Summary
## --------------------------------------------------------------------
## R 0.764 RMSE 0.666
<<<<<<< HEAD
## R-Squared 0.583 Coef. Var 9.665661e+16
=======
## R-Squared 0.583 Coef. Var 7.061126e+16
>>>>>>> 1a68e1f32bb9ac5b1b5fd87f9333e892037459b5
## Adj. R-Squared 0.557 MSE 0.443
## Pred R-Squared -Inf MAE 0.503
## --------------------------------------------------------------------
## RMSE: Root Mean Square Error
## MSE: Mean Square Error
## MAE: Mean Absolute Error
##
## ANOVA
## ----------------------------------------------------------------------
## Sum of
## Squares DF Mean Square F Sig.
## ----------------------------------------------------------------------
## Regression 1071.855 110 9.744 21.977 0.0000
## Residual 766.145 1728 0.443
## Total 1838.000 1838
## ----------------------------------------------------------------------
##
## Parameter Estimates
## --------------------------------------------------------------------------------------------------
## model Beta Std. Error Std. Beta t Sig lower upper
## --------------------------------------------------------------------------------------------------
## (Intercept) 0.417 1.360 0.307 0.759 -2.251 3.085
## TotalSF 0.159 0.050 0.159 3.200 0.001 0.062 0.257
## OverallQual 0.071 0.024 0.097 2.977 0.003 0.024 0.117
## LotArea 0.130 0.031 0.130 4.135 0.000 0.068 0.192
## GrLivArea 0.182 0.049 0.182 3.692 0.000 0.085 0.278
## YearBuilt1930_1960 0.258 0.072 0.106 3.575 0.000 0.116 0.399
## YearBuilt1960_1990 0.337 0.094 0.152 3.584 0.000 0.152 0.521
## YearBuilt1990_ 0.456 0.125 0.221 3.657 0.000 0.212 0.701
## OverallCond 0.086 0.018 0.096 4.818 0.000 0.051 0.121
## HeatingGasA 1.348 0.688 0.179 1.959 0.050 -0.002 2.699
## HeatingGasW 1.288 0.710 0.130 1.815 0.070 -0.104 2.680
## HeatingGrav 0.299 0.740 0.018 0.404 0.686 -1.152 1.750
## HeatingOthW 0.203 0.969 0.005 0.209 0.834 -1.698 2.104
## HeatingWall 0.802 0.749 0.042 1.070 0.285 -0.668 2.271
## NeighborhoodBlueste -0.185 0.342 -0.011 -0.541 0.588 -0.856 0.486
## NeighborhoodBrDale -0.462 0.293 -0.043 -1.575 0.115 -1.037 0.113
## NeighborhoodBrkSide -0.507 0.243 -0.094 -2.089 0.037 -0.983 -0.031
## NeighborhoodClearCr -0.332 0.246 -0.043 -1.351 0.177 -0.813 0.150
## NeighborhoodCollgCr -0.405 0.204 -0.113 -1.990 0.047 -0.805 -0.006
## NeighborhoodCrawfor -0.024 0.224 -0.005 -0.106 0.916 -0.463 0.415
## NeighborhoodEdwards -0.688 0.217 -0.160 -3.178 0.002 -1.113 -0.264
## NeighborhoodGilbert -0.372 0.214 -0.086 -1.739 0.082 -0.791 0.047
## NeighborhoodIDOTRR -0.443 0.259 -0.077 -1.711 0.087 -0.951 0.065
## NeighborhoodMeadowV -0.284 0.282 -0.035 -1.008 0.314 -0.836 0.269
## NeighborhoodMitchel -0.474 0.217 -0.095 -2.182 0.029 -0.901 -0.048
## NeighborhoodNAmes -0.449 0.211 -0.165 -2.131 0.033 -0.863 -0.036
## NeighborhoodNoRidge -0.116 0.221 -0.019 -0.525 0.599 -0.550 0.318
## NeighborhoodNPkVill -0.412 0.262 -0.039 -1.573 0.116 -0.925 0.101
## NeighborhoodNridgHt -0.288 0.206 -0.063 -1.398 0.162 -0.691 0.116
## NeighborhoodNWAmes -0.589 0.220 -0.119 -2.676 0.008 -1.020 -0.157
## NeighborhoodOldTown -0.544 0.240 -0.145 -2.266 0.024 -1.016 -0.073
## NeighborhoodSawyer -0.429 0.220 -0.096 -1.949 0.051 -0.860 0.003
## NeighborhoodSawyerW -0.455 0.211 -0.095 -2.160 0.031 -0.869 -0.042
## NeighborhoodSomerst -0.512 0.235 -0.124 -2.182 0.029 -0.972 -0.052
## NeighborhoodStoneBr 0.098 0.229 0.012 0.427 0.670 -0.352 0.548
## NeighborhoodSWISU -0.221 0.243 -0.030 -0.907 0.365 -0.698 0.257
## NeighborhoodTimber -0.398 0.222 -0.063 -1.789 0.074 -0.834 0.038
## NeighborhoodVeenker -0.828 0.273 -0.072 -3.030 0.002 -1.363 -0.292
## KitchenAbvGr -0.098 0.029 -0.098 -3.425 0.001 -0.155 -0.042
## BedroomAbvGr 0.092 0.024 0.092 3.864 0.000 0.045 0.139
## BsmtQualFa 0.114 0.170 0.019 0.667 0.505 -0.221 0.448
## BsmtQualTA -0.245 0.147 -0.122 -1.673 0.094 -0.533 0.042
## BsmtQualGd -0.173 0.154 -0.085 -1.124 0.261 -0.476 0.129
## BsmtQualEx -0.092 0.179 -0.025 -0.514 0.607 -0.443 0.259
## LandContourHLS 0.014 0.123 0.003 0.116 0.908 -0.227 0.255
## LandContourLow 0.310 0.152 0.043 2.039 0.042 0.012 0.607
## LandContourLvl 0.248 0.092 0.073 2.700 0.007 0.068 0.428
## MasVnrTypeBrkCmn -0.239 0.232 -0.024 -1.030 0.303 -0.694 0.216
## MasVnrTypeBrkFace -0.175 0.169 -0.080 -1.035 0.301 -0.507 0.157
## MasVnrTypeNone -0.109 0.168 -0.053 -0.647 0.518 -0.438 0.220
## MasVnrTypeStone 0.109 0.176 0.030 0.622 0.534 -0.236 0.455
## Total_Bathrooms 0.044 0.027 0.044 1.641 0.101 -0.009 0.097
## FunctionalMaj2 -0.589 0.390 -0.031 -1.512 0.131 -1.353 0.175
## FunctionalMin1 0.031 0.247 0.005 0.125 0.901 -0.454 0.516
## FunctionalMin2 0.085 0.249 0.013 0.343 0.732 -0.403 0.574
## FunctionalMod -0.024 0.269 -0.003 -0.089 0.929 -0.553 0.505
## FunctionalSev -1.423 0.728 -0.033 -1.955 0.051 -2.850 0.005
## FunctionalTyp 0.231 0.224 0.058 1.030 0.303 -0.209 0.670
## MSZoningC (all) -2.047 0.617 -0.172 -3.316 0.001 -3.258 -0.836
## MSZoningFV -1.871 0.615 -0.395 -3.042 0.002 -3.078 -0.665
## MSZoningRH -2.307 0.616 -0.239 -3.742 0.000 -3.516 -1.098
## MSZoningRL -2.017 0.595 -0.842 -3.388 0.001 -3.184 -0.849
## MSZoningRM -2.022 0.597 -0.739 -3.384 0.001 -3.193 -0.850
## LotShapeIR2 0.059 0.106 0.009 0.554 0.579 -0.150 0.267
## LotShapeIR3 -0.168 0.235 -0.012 -0.717 0.473 -0.628 0.292
## LotShapeReg 0.109 0.039 0.053 2.839 0.005 0.034 0.185
## KitchenQualTA 0.253 0.115 0.126 2.200 0.028 0.027 0.478
## KitchenQualGd 0.317 0.123 0.155 2.584 0.010 0.076 0.558
## KitchenQualEx 0.336 0.147 0.081 2.292 0.022 0.049 0.624
## KitchenQual4 1.265 0.720 0.029 1.758 0.079 -0.147 2.677
## PavedDriveP 0.042 0.133 0.006 0.315 0.753 -0.219 0.303
## PavedDriveY -0.164 0.079 -0.046 -2.077 0.038 -0.320 -0.009
## BsmtFinSF1 0.041 0.021 0.041 1.952 0.051 0.000 0.081
## GarageArea 0.034 0.023 0.034 1.472 0.141 -0.011 0.078
## PoolQCFa -0.954 0.646 -0.031 -1.477 0.140 -2.220 0.313
## PoolQCGd -2.250 0.604 -0.091 -3.726 0.000 -3.435 -1.065
## PoolQCEx 0.639 0.570 0.030 1.120 0.263 -0.479 1.757
## SaleTypeCOD -0.364 0.686 -0.064 -0.531 0.595 -1.710 0.981
## SaleTypeCon 0.126 0.832 0.004 0.152 0.879 -1.505 1.758
## SaleTypeConLD -0.227 0.703 -0.020 -0.323 0.747 -1.604 1.151
## SaleTypeConLI -0.238 0.720 -0.016 -0.331 0.741 -1.651 1.175
## SaleTypeConLw 0.061 0.763 0.003 0.079 0.937 -1.436 1.557
## SaleTypeCWD -0.670 0.720 -0.044 -0.931 0.352 -2.082 0.742
## SaleTypeNew -0.232 0.682 -0.063 -0.340 0.734 -1.570 1.106
## SaleTypeOth -0.322 0.745 -0.017 -0.432 0.666 -1.782 1.139
## SaleTypeWD -0.425 0.679 -0.145 -0.626 0.532 -1.756 0.906
## Fireplaces 0.026 0.021 0.026 1.272 0.203 -0.014 0.067
## PoolArea 1.321 0.275 1.321 4.810 0.000 0.782 1.859
## hasPoolTrue -15.954 3.425 -1.285 -4.658 0.000 -22.672 -9.235
## BldgType2fmCon -0.047 0.121 -0.007 -0.391 0.696 -0.284 0.189
## BldgTypeDuplex 0.125 0.143 0.025 0.876 0.381 -0.155 0.406
## BldgTypeTwnhs -0.058 0.144 -0.010 -0.399 0.690 -0.341 0.225
## BldgTypeTwnhsE -0.218 0.095 -0.059 -2.290 0.022 -0.406 -0.031
## YrSold2007 0.021 0.048 0.009 0.446 0.656 -0.073 0.116
## YrSold2008 0.089 0.050 0.036 1.786 0.074 -0.009 0.187
## YrSold2009 -0.004 0.049 -0.002 -0.078 0.938 -0.100 0.092
## YrSold2010 -0.031 0.058 -0.010 -0.541 0.589 -0.146 0.083
## Total_porch_SF 0.025 0.019 0.025 1.292 0.197 -0.013 0.062
## Exterior1stAsbShng -0.516 0.701 -0.059 -0.736 0.462 -1.891 0.859
## Exterior1stBrkComm -0.061 0.754 -0.003 -0.081 0.935 -1.540 1.417
## Exterior1stBrkFace -0.203 0.693 -0.035 -0.293 0.770 -1.561 1.155
## Exterior1stCBlock -1.042 0.887 -0.034 -1.175 0.240 -2.781 0.697
## Exterior1stCemntBd -0.444 0.695 -0.088 -0.639 0.523 -1.808 0.919
## Exterior1stHdBoard -0.377 0.689 -0.135 -0.547 0.584 -1.728 0.974
## Exterior1stMetalSd -0.394 0.688 -0.145 -0.573 0.567 -1.742 0.955
## Exterior1stPlywood -0.238 0.689 -0.066 -0.345 0.730 -1.590 1.114
## Exterior1stStone 0.067 0.838 0.002 0.080 0.936 -1.576 1.710
## Exterior1stStucco -0.572 0.700 -0.071 -0.817 0.414 -1.944 0.801
## Exterior1stVinylSd -0.455 0.688 -0.216 -0.660 0.509 -1.805 0.896
## Exterior1stWd Sdng -0.392 0.689 -0.134 -0.569 0.569 -1.743 0.959
## Exterior1stWdShing -0.340 0.696 -0.047 -0.489 0.625 -1.706 1.025
## --------------------------------------------------------------------------------------------------
length(modelStepForward$predictors)
## [1] 30
cat('El modelo stepforward usa', length(modelStepForward$model$coefficients), 'variables ')
## El modelo stepforward usa 111 variables
#plot(modelStepForward)
#ols_plot_resid_fit(modelStepForward$model)
Y por último, utilizando la libreria caret intentarmos obtener una reducción del número de parámetros del modelo mediante una regularización de tipo “lasso”:
<<<<<<< HEAD#gridLamdas <- expand.grid(alpha = 1, lambda = seq(0.001,0.1,by = 0.0005))
#varControl <-caret::trainControl(method="cv", number=10)
#lasso_mod <- caret::train(reformulate(termlabels = var_modelo, response = 'SalePrice'), data = data.frame(trainTransformed), method='glmnet', trControl= varControl, tuneGrid=gridLamdas)
#----------#lasso_mod$bestTune
#----------#min(lasso_mod$results$RMSE)
#lassoVarImp <- varImp(lasso_mod,scale=F)
#lassoImportance <- lassoVarImp$importance
#varsSelected <- length(which(lassoImportance$Overall!=0))
#varsNotSelected <- length(which(lassoImportance$Overall==0))
#cat(' El modelo de lasso usa', varsSelected, 'variables en el modelo, y rechazo ', varsNotSelected, 'variables.')
#lm_formula_2 <- as.formula(str_replace(paste("SalePrice ~ ",paste(predictors(lasso_mod) , #collapse=" + "), sep = " "),'&','.'))
=======
gridLamdas <- expand.grid(alpha = 1, lambda = seq(0.001,0.1,by = 0.0005))
varControl <-caret::trainControl(method="cv", number=10)
lasso_mod <- train(reformulate(termlabels = var_modelo, response = 'SalePrice'), data = data.frame(trainTransformed), method='glmnet', trControl= varControl, tuneGrid=gridLamdas)
#lasso_mod$bestTune
#min(lasso_mod$results$RMSE)
lassoVarImp <- varImp(lasso_mod,scale=F)
lassoImportance <- lassoVarImp$importance
varsSelected <- length(which(lassoImportance$Overall!=0))
varsNotSelected <- length(which(lassoImportance$Overall==0))
cat(' El modelo de lasso usa', varsSelected, 'variables en el modelo, y rechazo ', varsNotSelected, 'variables.')
## El modelo de lasso usa 57 variables en el modelo, y rechazo 171 variables.
#lm_formula_2 <- as.formula(str_replace(paste("SalePrice ~ ",paste(predictors(lasso_mod) , #collapse=" + "), sep = " "),'&','.'))
>>>>>>> 1a68e1f32bb9ac5b1b5fd87f9333e892037459b5
#modelLasso <- lm(lm_formula_2, data = data.frame(trainTransformedDummies))
#summary(modelLasso)
Como vemos, lasso ha quitado una gran cantidad de regresores, demasiados para nuestro gusto, por lo que no podemos estar seguros de que haya funcionado correctamente.
<<<<<<< HEAD
Ajuste, interpretación y diagnosis del modelo de regresión lineal múltiple (2 puntos)
Valoración del profesor (1 punto)
=======
- Ajuste, interpretación y diagnosis del modelo de regresión lineal múltiple (2 puntos)
En primer lugar almacenaremos los valores de las prediccion para la parte de test en 3 variables distintas. El segundo de los modelos da el siguiente warning ‘prediction from a rank-deficient fit may be misleading’ que no hemos sido capaces de discernir.
#valoresPredichosModeloCompleto <- predict(modelRegressionTotal,testTransformed)
#valoresPredichosModeloStepForward <- predict(modelStepForward$model,testTransformed)
#valoresPredichosModeloLasso <- predict(lasso_mod,testTransformed)
#vectorCorrelacionesModeloCompleto <- #data.frame(cbind(actuals=testTransformed$SalePrice,predicted=valoresPredichosModeloCompleto))
#correlacionModeloCompleto <- cor(vectorCorrelacionesModeloCompleto)
#vectorCorrelacionesModeloStepForward <- #data.frame(cbind(actuals=testTransformed$SalePrice,predicted=valoresPredichosModeloStepForward))
#correlacionModeloStepForward <- cor(vectorCorrelacionesModeloStepForward)
#vectorCorrelacionesModeloLasso <- #data.frame(cbind(actuals=testTransformed$SalePrice,predicted=valoresPredichosModeloLasso))
#correlacionModeloLasso <- cor(vectorCorrelacionesModeloLasso)
#cat('Correlacion modelo Completo entre predicciones train/test',correlacionModeloCompleto[1,2] )
#cat('Correlacion modelo StepForward entre predicciones #train/test',correlacionModeloStepForward[1,2] )
#cat('Correlacion modelo Lasso entre predicciones train/test',correlacionModeloLasso[1,2] )
# library(DMwR)
#regr.eval(valoresPredichosModeloCompleto,testTransformed$SalePrice)
#regr.eval(valoresPredichosModeloStepForward,testTransformed$SalePrice)
#regr.eval(valoresPredichosModeloLasso,testTransformed$SalePrice)
summary(modelRegressionTotal)
##
## Call:
## lm(formula = reformulate(termlabels = var_modelo, response = "SalePrice"),
## data = trainTransformed)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.9663 -0.3918 0.0000 0.4108 2.4806
##
## Coefficients: (2 not defined because of singularities)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.873161 1.832456 1.022 0.306833
## TotalSF 0.180393 0.083479 2.161 0.030846 *
## GrLivArea 0.152983 0.089559 1.708 0.087795 .
## LotArea 0.145665 0.033956 4.290 1.89e-05 ***
## Total_Bathrooms 0.045240 0.028764 1.573 0.115965
## Total_porch_SF 0.033507 0.020152 1.663 0.096563 .
## MSZoningC (all) -2.445156 0.702105 -3.483 0.000510 ***
## MSZoningFV -2.238034 0.697184 -3.210 0.001353 **
## MSZoningRH -2.524866 0.707415 -3.569 0.000369 ***
## MSZoningRL -2.289244 0.678550 -3.374 0.000759 ***
## MSZoningRM -2.282102 0.675665 -3.378 0.000749 ***
## AlleyNA -0.026095 0.100870 -0.259 0.795897
## AlleyPave 0.131427 0.162535 0.809 0.418860
## LandContourHLS 0.010992 0.131022 0.084 0.933152
## LandContourLow 0.289246 0.161928 1.786 0.074244 .
## LandContourLvl 0.199976 0.099875 2.002 0.045425 *
## LotConfigCulDSac 0.022405 0.087672 0.256 0.798331
## LotConfigFR2 -0.070788 0.110754 -0.639 0.522821
## LotConfigFR3 0.046848 0.225196 0.208 0.835231
## LotConfigInside -0.028665 0.046538 -0.616 0.538021
## Condition1Feedr 0.153309 0.122406 1.252 0.210582
## Condition1Norm 0.218536 0.100787 2.168 0.030281 *
## Condition1PosA 0.031731 0.213062 0.149 0.881628
## Condition1PosN 0.086515 0.179578 0.482 0.630035
## Condition1RRAe 0.043524 0.207988 0.209 0.834272
## Condition1RRAn 0.137167 0.166737 0.823 0.410827
## Condition1RRNe 0.261381 0.431618 0.606 0.544876
## Condition1RRNn 0.203405 0.287846 0.707 0.479889
## BldgType2fmCon 0.006627 0.132725 0.050 0.960182
## BldgTypeDuplex 0.286474 0.167303 1.712 0.087031 .
## BldgTypeTwnhs -0.074779 0.153068 -0.489 0.625239
## BldgTypeTwnhsE -0.229889 0.103296 -2.226 0.026183 *
## HouseStyle1.5Unf -0.277059 0.259092 -1.069 0.285073
## HouseStyle1Story 0.032941 0.152621 0.216 0.829142
## HouseStyle2.5Fin 0.140841 0.506826 0.278 0.781134
## HouseStyle2.5Unf -0.347044 0.207996 -1.669 0.095408 .
## HouseStyle2Story -0.005198 0.075457 -0.069 0.945083
## HouseStyleSFoyer 0.072151 0.189756 0.380 0.703824
## HouseStyleSLvl 0.112464 0.146511 0.768 0.442828
## RoofStyleGable 0.169156 0.270306 0.626 0.531539
## RoofStyleGambrel 0.347604 0.327405 1.062 0.288533
## RoofStyleHip 0.132636 0.273405 0.485 0.627653
## RoofStyleMansard -0.312093 0.384703 -0.811 0.417337
## RoofStyleShed 0.164231 0.411541 0.399 0.689899
## Exterior1stAsbShng -0.508201 0.810174 -0.627 0.530569
## Exterior1stBrkComm -0.440102 0.851005 -0.517 0.605119
## Exterior1stBrkFace -0.298877 0.778683 -0.384 0.701159
## Exterior1stCBlock -1.737712 1.071797 -1.621 0.105147
## Exterior1stCemntBd -0.410769 1.050698 -0.391 0.695887
## Exterior1stHdBoard -0.688059 0.778320 -0.884 0.376811
## Exterior1stMetalSd -0.743899 0.787750 -0.944 0.345141
## Exterior1stPlywood -0.477188 0.777368 -0.614 0.539401
## Exterior1stStone 0.018152 0.937201 0.019 0.984549
## Exterior1stStucco -0.828993 0.789657 -1.050 0.293961
## Exterior1stVinylSd -0.979024 0.789778 -1.240 0.215297
## Exterior1stWd Sdng -0.550712 0.774996 -0.711 0.477435
## Exterior1stWdShing -0.570756 0.768840 -0.742 0.457978
## Exterior2ndAsbShng -0.464362 0.298608 -1.555 0.120121
## Exterior2ndBrk Cmn 0.082500 0.364477 0.226 0.820956
## Exterior2ndBrkFace -0.365681 0.225073 -1.625 0.104418
## Exterior2ndCBlock 0.447750 0.541200 0.827 0.408173
## Exterior2ndCmentBd -0.346287 0.738867 -0.469 0.639367
## Exterior2ndHdBoard -0.013012 0.171336 -0.076 0.939473
## Exterior2ndImStucc -0.122362 0.274857 -0.445 0.656247
## Exterior2ndMetalSd 0.011399 0.214608 0.053 0.957648
## Exterior2ndOther 1.017252 0.734087 1.386 0.166018
## Exterior2ndPlywood -0.096727 0.163972 -0.590 0.555340
## Exterior2ndStone 0.027157 0.408054 0.067 0.946947
## Exterior2ndStucco 0.041575 0.219346 0.190 0.849694
## Exterior2ndVinylSd 0.185178 0.209234 0.885 0.376272
## Exterior2ndWd Sdng -0.171907 0.156471 -1.099 0.272087
## Exterior2ndWd Shng NA NA NA NA
## MasVnrTypeBrkCmn -0.278443 0.242129 -1.150 0.250324
## MasVnrTypeBrkFace -0.146189 0.175465 -0.833 0.404883
## MasVnrTypeNone -0.057616 0.173060 -0.333 0.739236
## MasVnrTypeStone 0.153377 0.181561 0.845 0.398365
## FoundationCBlock -0.058583 0.083475 -0.702 0.482907
## FoundationPConc -0.010107 0.088418 -0.114 0.909003
## FoundationSlab -0.218170 0.263467 -0.828 0.407752
## FoundationStone 0.317134 0.287023 1.105 0.269364
## FoundationWood 0.256771 0.513848 0.500 0.617353
## HeatingGasA 1.132389 0.752597 1.505 0.132612
## HeatingGasW 1.073508 0.769609 1.395 0.163246
## HeatingGrav 0.017877 0.822403 0.022 0.982660
## HeatingOthW -0.148377 1.045900 -0.142 0.887204
## HeatingWall 0.481179 0.854487 0.563 0.573431
## SaleTypeCOD -0.266214 0.716409 -0.372 0.710243
## SaleTypeCon 0.196229 0.860092 0.228 0.819559
## SaleTypeConLD -0.302795 0.732663 -0.413 0.679457
## SaleTypeConLI -0.309013 0.751770 -0.411 0.681093
## SaleTypeConLw 0.171383 0.795019 0.216 0.829349
## SaleTypeCWD -0.568876 0.749575 -0.759 0.448004
## SaleTypeNew -0.467706 0.875009 -0.535 0.593059
## SaleTypeOth -0.245576 0.774944 -0.317 0.751364
## SaleTypeWD -0.382044 0.706756 -0.541 0.588885
## SaleConditionAdjLand -0.020796 0.317797 -0.065 0.947834
## SaleConditionAlloca 0.014044 0.230180 0.061 0.951356
## SaleConditionFamily 0.069683 0.148479 0.469 0.638909
## SaleConditionNormal 0.051747 0.075131 0.689 0.491074
## SaleConditionPartial 0.326691 0.503789 0.648 0.516775
## YearBuilt1930_1960 0.290372 0.085914 3.380 0.000743 ***
## YearBuilt1960_1990 0.366042 0.120420 3.040 0.002406 **
## YearBuilt1990_ 0.422451 0.153033 2.761 0.005836 **
## YearRemodAdd1960_1990 -0.019312 0.080401 -0.240 0.810206
## YearRemodAdd1990_ 0.007128 0.072373 0.098 0.921554
## MasVnrArea 0.019501 0.026516 0.735 0.462182
## MoSold2 0.118219 0.115451 1.024 0.306003
## MoSold3 0.197929 0.100414 1.971 0.048879 *
## MoSold4 0.164439 0.098429 1.671 0.094987 .
## MoSold5 0.126838 0.094363 1.344 0.179090
## MoSold6 0.151766 0.092140 1.647 0.099726 .
## MoSold7 0.148925 0.092746 1.606 0.108529
## MoSold8 0.288632 0.103965 2.776 0.005563 **
## MoSold9 0.217130 0.111542 1.947 0.051755 .
## MoSold10 0.154125 0.111569 1.381 0.167338
## MoSold11 0.199082 0.109555 1.817 0.069373 .
## MoSold12 0.297279 0.121407 2.449 0.014446 *
## YrSold2007 0.025579 0.050480 0.507 0.612432
## YrSold2008 0.091284 0.052405 1.742 0.081716 .
## YrSold2009 0.006322 0.051491 0.123 0.902291
## YrSold2010 0.008170 0.063785 0.128 0.898098
## OverallQual 0.065800 0.026111 2.520 0.011832 *
## OverallCond 0.083004 0.022031 3.768 0.000171 ***
## PavedDriveP 0.044357 0.141635 0.313 0.754186
## PavedDriveY -0.186198 0.088041 -2.115 0.034592 *
## PoolArea 1.400546 0.293639 4.770 2.01e-06 ***
## PoolQCFa -0.751910 0.679666 -1.106 0.268765
## PoolQCGd -2.316427 0.645019 -3.591 0.000339 ***
## PoolQCEx 0.674645 0.616015 1.095 0.273603
## FenceGdWo 0.120959 0.123214 0.982 0.326393
## FenceMnPrv 0.028706 0.101073 0.284 0.776438
## FenceMnWw -0.387087 0.254938 -1.518 0.129120
## FenceNA 0.054775 0.090795 0.603 0.546405
## BsmtFinSF1 0.042315 0.023703 1.785 0.074415 .
## ElectricalFuseA 0.091276 0.706482 0.129 0.897217
## ElectricalFuseF -0.028277 0.718665 -0.039 0.968619
## ElectricalFuseP 0.004985 0.889310 0.006 0.995528
## ElectricalSBrkr 0.134375 0.703635 0.191 0.848571
## FunctionalMaj2 -0.692342 0.415553 -1.666 0.095893 .
## FunctionalMin1 0.003609 0.260590 0.014 0.988951
## FunctionalMin2 -0.089700 0.264518 -0.339 0.734574
## FunctionalMod -0.111250 0.282150 -0.394 0.693417
## FunctionalSev -0.949368 0.839976 -1.130 0.258546
## FunctionalTyp 0.134947 0.236059 0.572 0.567628
## ExterCondTA -0.047597 0.130745 -0.364 0.715870
## ExterCondGd -0.151094 0.141042 -1.071 0.284206
## ExterCondEx -0.037306 0.295392 -0.126 0.899514
## ExterQualTA 0.040952 0.206306 0.199 0.842677
## ExterQualGd 0.118856 0.214934 0.553 0.580347
## ExterQualEx 0.083548 0.248888 0.336 0.737152
## BsmtQualFa 0.065466 0.534163 0.123 0.902472
## BsmtQualTA -0.268037 0.525664 -0.510 0.610190
## BsmtQualGd -0.229221 0.528648 -0.434 0.664638
## BsmtQualEx -0.101198 0.538344 -0.188 0.850916
## BsmtExposureNo 0.446589 0.437008 1.022 0.306970
## BsmtExposureMn 0.510761 0.441033 1.158 0.246994
## BsmtExposureAv 0.462751 0.439897 1.052 0.292978
## BsmtExposureGd 0.405378 0.444795 0.911 0.362230
## BsmtFinType1Unf -0.530980 0.529141 -1.003 0.315782
## BsmtFinType1LwQ -0.614832 0.536518 -1.146 0.251979
## BsmtFinType1Rec -0.593191 0.536255 -1.106 0.268817
## BsmtFinType1BLQ -0.614346 0.538288 -1.141 0.253916
## BsmtFinType1ALQ -0.343969 0.546737 -0.629 0.529352
## BsmtFinType1GLQ -0.760802 0.547486 -1.390 0.164834
## BsmtUnfSF 0.001617 0.027046 0.060 0.952344
## HeatingQCFa -0.162798 0.551453 -0.295 0.767866
## HeatingQCTA -0.261948 0.538554 -0.486 0.626756
## HeatingQCGd -0.220952 0.539058 -0.410 0.681944
## HeatingQCEx -0.212473 0.538464 -0.395 0.693197
## CentralAirY 0.019999 0.096001 0.208 0.835002
## KitchenQualTA 0.250092 0.124330 2.012 0.044436 *
## KitchenQualGd 0.277087 0.133189 2.080 0.037646 *
## KitchenQualEx 0.311923 0.159731 1.953 0.051016 .
## KitchenQual4 1.325591 0.754300 1.757 0.079043 .
## Fireplaces 0.052891 0.042418 1.247 0.212618
## FireplaceQuPo 0.055933 0.148699 0.376 0.706857
## FireplaceQuFa -0.017918 0.131385 -0.136 0.891538
## FireplaceQuTA -0.113545 0.090696 -1.252 0.210776
## FireplaceQuGd -0.077245 0.089040 -0.868 0.385779
## FireplaceQuEx -0.003119 0.166826 -0.019 0.985083
## BedroomAbvGr 0.077538 0.026144 2.966 0.003063 **
## KitchenAbvGr -0.111272 0.031674 -3.513 0.000455 ***
## LotShapeIR2 0.052390 0.113077 0.463 0.643200
## LotShapeIR3 -0.155584 0.242110 -0.643 0.520564
## LotShapeReg 0.128445 0.041658 3.083 0.002082 **
## GarageTypeAttchd -0.039130 0.199315 -0.196 0.844383
## GarageTypeBasment 0.048964 0.275689 0.178 0.859056
## GarageTypeBuiltIn 0.020755 0.212542 0.098 0.922220
## GarageTypeCarPort -0.355745 0.296749 -1.199 0.230780
## GarageTypeDetchd -0.066162 0.199811 -0.331 0.740593
## GarageTypeNA -0.432061 0.566778 -0.762 0.445986
## GarageArea 0.008125 0.028772 0.282 0.777689
## GarageQualFa -0.301099 0.490694 -0.614 0.539554
## GarageQualTA -0.390393 0.499033 -0.782 0.434155
## GarageQualGd -0.266408 0.548029 -0.486 0.626947
## GarageQualEx -1.232019 1.020068 -1.208 0.227308
## GarageQualNA -0.563219 0.702922 -0.801 0.423103
## GarageCondFa -0.552135 0.292534 -1.887 0.059283 .
## GarageCondTA -0.415249 0.282428 -1.470 0.141681
## GarageCondGd -0.196843 0.403632 -0.488 0.625842
## GarageCondEx 0.131863 0.791254 0.167 0.867666
## GarageCondNA NA NA NA NA
## NeighborhoodBlueste -0.051384 0.357216 -0.144 0.885639
## NeighborhoodBrDale -0.496274 0.313465 -1.583 0.113574
## NeighborhoodBrkSide -0.567702 0.257380 -2.206 0.027546 *
## NeighborhoodClearCr -0.413326 0.259552 -1.592 0.111477
## NeighborhoodCollgCr -0.462330 0.210417 -2.197 0.028148 *
## NeighborhoodCrawfor -0.160134 0.234571 -0.683 0.494913
## NeighborhoodEdwards -0.751311 0.226676 -3.314 0.000939 ***
## NeighborhoodGilbert -0.428278 0.223092 -1.920 0.055068 .
## NeighborhoodIDOTRR -0.451750 0.275070 -1.642 0.100721
## NeighborhoodMeadowV -0.298003 0.296079 -1.006 0.314327
## NeighborhoodMitchel -0.514477 0.227451 -2.262 0.023835 *
## NeighborhoodNAmes -0.454508 0.220703 -2.059 0.039619 *
## NeighborhoodNoRidge -0.125535 0.235355 -0.533 0.593840
## NeighborhoodNPkVill -0.477534 0.354201 -1.348 0.177783
## NeighborhoodNridgHt -0.380070 0.216510 -1.755 0.079374 .
## NeighborhoodNWAmes -0.538648 0.231885 -2.323 0.020308 *
## NeighborhoodOldTown -0.594101 0.255786 -2.323 0.020322 *
## NeighborhoodSawyer -0.425890 0.230510 -1.848 0.064844 .
## NeighborhoodSawyerW -0.483545 0.219933 -2.199 0.028048 *
## NeighborhoodSomerst -0.544850 0.244905 -2.225 0.026237 *
## NeighborhoodStoneBr -0.052980 0.239907 -0.221 0.825248
## NeighborhoodSWISU -0.323531 0.258114 -1.253 0.210225
## NeighborhoodTimber -0.475600 0.231761 -2.052 0.040320 *
## NeighborhoodVeenker -0.784932 0.291703 -2.691 0.007200 **
## hasPoolTrue -16.979619 3.658745 -4.641 3.75e-06 ***
## has2ndFloorTrue 0.078572 0.148910 0.528 0.597814
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6719 on 1613 degrees of freedom
## Multiple R-squared: 0.6039, Adjusted R-squared: 0.5486
## F-statistic: 10.93 on 225 and 1613 DF, p-value: < 2.2e-16
summary(modelStepForward$model)
##
## Call:
## lm(formula = paste(response, "~", paste(preds, collapse = " + ")),
## data = l)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.2224 -0.4198 0.0000 0.4382 2.5542
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.416987 1.360074 0.307 0.759192
## TotalSF 0.159358 0.049796 3.200 0.001398 **
## OverallQual 0.070532 0.023689 2.977 0.002948 **
## LotArea 0.130087 0.031459 4.135 3.72e-05 ***
## GrLivArea 0.181689 0.049216 3.692 0.000230 ***
## YearBuilt1930_1960 0.257917 0.072147 3.575 0.000360 ***
## YearBuilt1960_1990 0.336677 0.093937 3.584 0.000348 ***
## YearBuilt1990_ 0.456338 0.124775 3.657 0.000263 ***
## OverallCond 0.085935 0.017836 4.818 1.58e-06 ***
## HeatingGasA 1.348436 0.688429 1.959 0.050307 .
## HeatingGasW 1.288143 0.709574 1.815 0.069640 .
## HeatingGrav 0.298811 0.739736 0.404 0.686304
## HeatingOthW 0.202814 0.969394 0.209 0.834303
## HeatingWall 0.801801 0.749310 1.070 0.284745
## NeighborhoodBlueste -0.185089 0.341914 -0.541 0.588348
## NeighborhoodBrDale -0.461982 0.293236 -1.575 0.115332
## NeighborhoodBrkSide -0.507046 0.242721 -2.089 0.036853 *
## NeighborhoodClearCr -0.331777 0.245596 -1.351 0.176904
## NeighborhoodCollgCr -0.405246 0.203601 -1.990 0.046705 *
## NeighborhoodCrawfor -0.023711 0.223855 -0.106 0.915656
## NeighborhoodEdwards -0.688234 0.216534 -3.178 0.001507 **
## NeighborhoodGilbert -0.371564 0.213606 -1.739 0.082127 .
## NeighborhoodIDOTRR -0.443034 0.258860 -1.711 0.087172 .
## NeighborhoodMeadowV -0.283910 0.281659 -1.008 0.313599
## NeighborhoodMitchel -0.474377 0.217431 -2.182 0.029263 *
## NeighborhoodNAmes -0.449362 0.210847 -2.131 0.033212 *
## NeighborhoodNoRidge -0.116298 0.221312 -0.525 0.599309
## NeighborhoodNPkVill -0.411794 0.261706 -1.573 0.115786
## NeighborhoodNridgHt -0.287654 0.205724 -1.398 0.162216
## NeighborhoodNWAmes -0.588828 0.220013 -2.676 0.007514 **
## NeighborhoodOldTown -0.544349 0.240276 -2.266 0.023604 *
## NeighborhoodSawyer -0.428856 0.219985 -1.949 0.051400 .
## NeighborhoodSawyerW -0.455298 0.210757 -2.160 0.030887 *
## NeighborhoodSomerst -0.511796 0.234577 -2.182 0.029260 *
## NeighborhoodStoneBr 0.097860 0.229415 0.427 0.669751
## NeighborhoodSWISU -0.220667 0.243399 -0.907 0.364741
## NeighborhoodTimber -0.397741 0.222324 -1.789 0.073788 .
## NeighborhoodVeenker -0.827594 0.273145 -3.030 0.002483 **
## KitchenAbvGr -0.098499 0.028761 -3.425 0.000630 ***
## BedroomAbvGr 0.092274 0.023879 3.864 0.000116 ***
## BsmtQualFa 0.113725 0.170430 0.667 0.504679
## BsmtQualTA -0.245474 0.146703 -1.673 0.094455 .
## BsmtQualGd -0.173330 0.154235 -1.124 0.261253
## BsmtQualEx -0.091989 0.178820 -0.514 0.607023
## LandContourHLS 0.014209 0.122741 0.116 0.907854
## LandContourLow 0.309500 0.151771 2.039 0.041576 *
## LandContourLvl 0.247845 0.091801 2.700 0.007006 **
## MasVnrTypeBrkCmn -0.238835 0.231963 -1.030 0.303329
## MasVnrTypeBrkFace -0.175022 0.169180 -1.035 0.301031
## MasVnrTypeNone -0.108563 0.167744 -0.647 0.517591
## MasVnrTypeStone 0.109466 0.176104 0.622 0.534288
## Total_Bathrooms 0.044158 0.026916 1.641 0.101074
## FunctionalMaj2 -0.588970 0.389514 -1.512 0.130701
## FunctionalMin1 0.030913 0.247314 0.125 0.900543
## FunctionalMin2 0.085403 0.248925 0.343 0.731576
## FunctionalMod -0.023956 0.269483 -0.089 0.929174
## FunctionalSev -1.422820 0.727802 -1.955 0.050749 .
## FunctionalTyp 0.230779 0.224073 1.030 0.303187
## MSZoningC (all) -2.047360 0.617447 -3.316 0.000933 ***
## MSZoningFV -1.871321 0.615192 -3.042 0.002387 **
## MSZoningRH -2.307008 0.616448 -3.742 0.000188 ***
## MSZoningRL -2.016788 0.595223 -3.388 0.000719 ***
## MSZoningRM -2.021640 0.597367 -3.384 0.000730 ***
## LotShapeIR2 0.058946 0.106329 0.554 0.579397
## LotShapeIR3 -0.168251 0.234553 -0.717 0.473271
## LotShapeReg 0.109470 0.038559 2.839 0.004578 **
## KitchenQualTA 0.252891 0.114929 2.200 0.027909 *
## KitchenQualGd 0.316997 0.122693 2.584 0.009857 **
## KitchenQualEx 0.336498 0.146828 2.292 0.022038 *
## KitchenQual4 1.264959 0.719729 1.758 0.079001 .
## PavedDriveP 0.041959 0.133114 0.315 0.752643
## PavedDriveY -0.164432 0.079174 -2.077 0.037963 *
## BsmtFinSF1 0.040592 0.020794 1.952 0.051093 .
## GarageArea 0.033623 0.022846 1.472 0.141273
## PoolQCFa -0.953747 0.645735 -1.477 0.139859
## PoolQCGd -2.250049 0.603958 -3.726 0.000201 ***
## PoolQCEx 0.638563 0.569999 1.120 0.262747
## SaleTypeCOD -0.364350 0.685888 -0.531 0.595342
## SaleTypeCon 0.126409 0.831892 0.152 0.879241
## SaleTypeConLD -0.226571 0.702530 -0.323 0.747107
## SaleTypeConLI -0.238303 0.720461 -0.331 0.740863
## SaleTypeConLw 0.060657 0.762980 0.079 0.936644
## SaleTypeCWD -0.670072 0.720037 -0.931 0.352187
## SaleTypeNew -0.231915 0.682148 -0.340 0.733915
## SaleTypeOth -0.321652 0.744549 -0.432 0.665789
## SaleTypeWD -0.424518 0.678620 -0.626 0.531685
## Fireplaces 0.026485 0.020815 1.272 0.203418
## PoolArea 1.320647 0.274557 4.810 1.64e-06 ***
## hasPoolTrue -15.953696 3.425323 -4.658 3.44e-06 ***
## BldgType2fmCon -0.047147 0.120520 -0.391 0.695702
## BldgTypeDuplex 0.125433 0.143124 0.876 0.380940
## BldgTypeTwnhs -0.057608 0.144308 -0.399 0.689794
## BldgTypeTwnhsE -0.218455 0.095379 -2.290 0.022119 *
## YrSold2007 0.021424 0.048090 0.446 0.656014
## YrSold2008 0.089265 0.049969 1.786 0.074207 .
## YrSold2009 -0.003819 0.049105 -0.078 0.938019
## YrSold2010 -0.031497 0.058228 -0.541 0.588625
## Total_porch_SF 0.024558 0.019013 1.292 0.196654
## Exterior1stAsbShng -0.516130 0.701197 -0.736 0.461788
## Exterior1stBrkComm -0.061268 0.753738 -0.081 0.935225
## Exterior1stBrkFace -0.202983 0.692611 -0.293 0.769504
## Exterior1stCBlock -1.041946 0.886571 -1.175 0.240055
## Exterior1stCemntBd -0.444468 0.695243 -0.639 0.522713
## Exterior1stHdBoard -0.376837 0.688827 -0.547 0.584401
## Exterior1stMetalSd -0.393761 0.687503 -0.573 0.566894
## Exterior1stPlywood -0.238014 0.689264 -0.345 0.729899
## Exterior1stStone 0.067249 0.837717 0.080 0.936026
## Exterior1stStucco -0.571769 0.699726 -0.817 0.413965
## Exterior1stVinylSd -0.454594 0.688476 -0.660 0.509156
## Exterior1stWd Sdng -0.391863 0.688752 -0.569 0.569467
## Exterior1stWdShing -0.340235 0.696225 -0.489 0.625127
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6659 on 1728 degrees of freedom
## Multiple R-squared: 0.5832, Adjusted R-squared: 0.5566
## F-statistic: 21.98 on 110 and 1728 DF, p-value: < 2.2e-16
min(lasso_mod$results$RMSE)
## [1] 0.7109655
par(mfrow=c(2,2))
plot(modelRegressionTotal)
## Warning: not plotting observations with leverage one:
## 118, 584, 718, 799, 903, 1077, 1094, 1143, 1323, 1426
## Warning: not plotting observations with leverage one:
## 118, 584, 718, 799, 903, 1077, 1094, 1143, 1323, 1426

plot(modelRegressionTotal,4,id.n=5)

plot(modelRegressionTotal,5,id.n=5)
## Warning: not plotting observations with leverage one:
## 118, 584, 718, 799, 903, 1077, 1094, 1143, 1323, 1426

par(mfrow=c(2,2))
plot(modelStepForward$model)
## Warning: not plotting observations with leverage one:
## 118, 718, 799, 1077, 1094, 1426
## Warning: not plotting observations with leverage one:
## 118, 718, 799, 1077, 1094, 1426

plot(modelStepForward$model,4,id.n=5)

plot(modelStepForward$model,5,id.n=5)
## Warning: not plotting observations with leverage one:
## 118, 718, 799, 1077, 1094, 1426

- Valoración del profesor (1 punto)
>>>>>>> 1a68e1f32bb9ac5b1b5fd87f9333e892037459b5